首页 > 其他分享 >leetcode||707.双向链表

leetcode||707.双向链表

时间:2024-07-10 20:56:57浏览次数:11  
标签:ListNode 707 list System next 链表 println leetcode out

1.思路:设置虚拟头节点和虚拟尾节点

2.为了提高查询效率,在根据索引查找节点的值时注意头尾虚拟节点的选择。

java代码

public class DoubleList707 {
    //1.双向链表的结构
    private class ListNode{
        int value;
        ListNode pre;
        ListNode next;
        public ListNode(){};
        public ListNode(ListNode pre,int value,ListNode next){
            this.pre=pre;
            this.value=value;
            this.next=next;
        }
    }
    //虚拟头节点
    ListNode head;
    //虚拟尾节点
    ListNode tail;
    //记录链表长度
    int size;
    //2.初始化
    public DoubleList707(){
        head = new ListNode(null,-1,null);
        tail = new ListNode(null,-1,null);
        head.next=tail;
        tail.pre=head;
        size=0;
    }

    //3.遍历
    //注意p!=tail
    public void ForEach11(Consumer<Integer> consumer){
        for (ListNode p =head.next;p!=tail;p=p.next){
            consumer.accept(p.value);
        }
    }
    //4.根据索引得到对应节点的值
    public int get(int index){
        if(index<0 ||index >=size){
            return -1;
        }
        ListNode p = head.next;
        //判断从头节点节点历时最短还是尾节点历时最短
        if(index>=(size>>1)){
            p=tail;
            for (int i = 0; i < (size-index); i++) {
                p=p.pre;
            }
        }else{
            for (int i = 0; i < index; i++) {
                p=p.next;
            }
        }

        return p.value;
    }
    //5.从头部添加节点
    public void FistInsert(int value){
        insert(value,0);
    }
    //6.尾部添加节点
    public void listInsert(int value){
        insert(value,size);
    }
    //7.根据索引(某节点前)插入节点
    public void insert(int value,int index){
        if(index > size){
            return;
        }
        if(index<0){
            index = 0;
        }
        ListNode p = head.next;
        for (int i = 0; i < index; i++) {
            p=p.next;
        }
        ListNode prenode=p.pre;
        ListNode cur = new ListNode(prenode,value,p);
        prenode.next=cur;
        p.pre = cur;
        size++;

    }
    //8.根据索引删除对应节点
    public void delete(int index){
        if(index<0 ||index >=size ){
            return;
        }
        ListNode p = head.next;
        for (int i = 0; i < index; i++) {
            p=p.next;
        }
        ListNode prenode = p.pre;
        ListNode nextnode = p.next;
        prenode.next=nextnode;
        nextnode.pre=prenode;
        size--;

    }
}

测试:

@Test
    public void test11(){
        DoubleList707 list = new DoubleList707();
        list.ForEach11(s-> System.out.println(s));
        list.FistInsert(1);
        list.FistInsert(6);
        list.FistInsert(9);
        list.FistInsert(8);
        list.FistInsert(2);
        System.out.println("2->8->9->6->1");
        list.ForEach11(s-> System.out.println(s));
        list.delete(0);
        System.out.println("8->9->6->1");
        list.ForEach11(s-> System.out.println(s));
        list.delete(1);
        System.out.println("8->6->1");
        list.ForEach11(s-> System.out.println(s));
        list.delete(2);
        System.out.println("8->6");
        list.ForEach11(s-> System.out.println(s));
        list.insert(1,1);
        System.out.println("8->1->6");
        list.ForEach11(s-> System.out.println(s));
        list.insert(9,3);
        System.out.println("8->1->6->9");
        list.ForEach11(s-> System.out.println(s));
        System.out.println("-----------------------");
        System.out.println(list.get(3));
    }

标签:ListNode,707,list,System,next,链表,println,leetcode,out
From: https://blog.csdn.net/m0_74558517/article/details/140333702

相关文章

  • 信息学奥赛初赛天天练-43-CSP-J2020基础题-链表、连通图、2进制转10进制、栈、队列、
    PDF文档公众号回复关键字:202407102020CSP-J选择题单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)7.链表不具有的特点是()A.可随机访问任一元素B.不必事先估计存储空间C.插入删除不需要移动元素D.所需空间与线性表长度成正比8.有10个顶点的无向图至少......
  • Day4|24. 两两交换链表中的节点 & 19.删除链表的倒数第N个节点 & 面试题 02.07. 链表
    24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。输入:head=[1,2,3,4]输出:[2,1,4,3]这题很简单就不写思路了publicListNodeswapPairs(ListNodehead){L......
  • 19. 删除链表的倒数第 N 个结点
    [https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/?envType=study-plan-v2&envId=top-interview-150](19.删除链表的倒数第N个结点)mid(简单)快慢指针时间复杂度O(L)空间复杂度O(1)classSolution{publicListNoderemoveNthFromEnd(ListNode......
  • 【数据结构】—— 双向链表
    文章目录1、双向链表的概念2、双向链表的接口实现2.1结构2.2初始化申请节点2.3插入数据尾插头插指定位置之后插入数据2.4删除数据尾删头删指定位置删除2.5查找2.6打印2.7销毁3、链表和顺序表的区别4、问题与思考1、双向链表的概念双向链表(DoublyLinkedList)是......
  • Day3| 203.移除链表元素 & 707.设计链表 & 206.反转链表
    前两天发烧了,这几天没更的后续会补齐链表结构如下classListNode{intval;ListNodenext;ListNode(){}ListNode(intval){this.val=val;}ListNode(intval,ListNodenext){this.val=val;this.next......
  • leetcode 704.二分查找
    重点区分:while(left<right) 和 while(left<=right)right=middle和right=middle-1当处于左闭右闭区间内时,while(left<=right)当处于左闭右开区间时,while(left<right)right=middle和right=middle-1,以此类推1.原理(来源代码随想录)(1)第一种情况(2)第二......
  • 菜鸟的Leetcode(02)
    系列文章目录第1章 求和第2章 回文文章目录系列文章目录前言一、题目二、知识点三、解题步骤1.思路2.实现3.演示4.其他总结一、题目给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数......
  • 141. 环形链表
    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅仅是为......
  • 数据结构--单向链表篇(python实现)
    写在开头链表(Linkedlist)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)链表的优缺点优点不需要预先知道数据大小,实现灵活的内存动态管理插入、删除指定数据速度快缺点读取指定位置数据速......
  • 138. 随机链表的复制
    138.随机链表的复制递归和哈希表时间&空间复杂度O(n)复杂链表的特点是每个节点除了有一个指向下一个节点的指针外,还有一个随机指针可能指向链表中的任意节点或null。通过递归和哈希表的方式,能够确保每个节点只被复制一次,并且正确地复制了next和random指针。/*//Definitionf......