4.LinkedList的模拟实现:

LinkedList的底层是一个不带头的双向链表。
不带头双向链表中的每一个节点有三个域:值域,上一个节点的域,下一个节点的域。

不带头双向链表的实现:

java 复制代码
public class Mylinkdelist{
    //定义一个内部类(节点)
        static class ListNode{
            int val;//值域
            ListNode prev;//指向前一个节点
            ListNode next;//指向后一个节点
            public ListNode(int val){//构造方法
                this.val=val;
            }
        }
        ListNode head=null;//定义一个头结点
        ListNode last=null;//定义一个尾链表
        public void addIndex(int Index,int data){//从指定位置插入
            int len=size();
            if(Index<0||Index>len){
                return ;
            }
            ListNode node = new ListNode (data); 
            if(Index==0){
                addFirst(data);
                return ;
            }
            if(Index==len){
                addLast(data);
                return;
            }
            ListNode cur=head;
            int count=0;
            while(count!=Index){
                count++;
                cur=cur.next;
            }
            node.next=cur;
            node.prev=cur.prev;
            cur.prev.next=node;
            cur.prev=node;
            
        }
        public void addLast(int key){//尾插
            ListNode node=new ListNode(key);
            if(last==null){
                head=last=noed;
            }else{
                last.next=node;
                node.prev=last;
                last=node;
            }
        }
    public void addFirst(int key){//头插
        ListNode node=new ListNode(key);
        if(head==null){
            head=last=node;
        }else{
            node.next=head;
            head.prev=node;
            head=node;
        }
    }  
    public void diaplay(){//把双向链表展示出来
        ListNode cur=head;
        while(cur!=null){//用cur遍历链表
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
    }
    public int size(){//求链表的长度
        ListNode cur=head;
        int count=0;
        while(cur!=null){
            cur=cur.next;
            count++:
        }
        return count;
    }
    public boolean contains(int key){//查找
        ListNode cur=head;
        while(cur!=null){
            if(cur.val==key){
                return true;
            }
            cur=cur.next;
        }
        return false;
    }
    public void remove(int key){//删除节点
        ListNode cur=head;
        while(cur!=null){
            if(cur.val==key){
                if(cur==head){
                     head=head.next;
                    if(head==null){
                        head.prev=null;
                    }
                   
                }else{
                   cur.prev.next=cur.next;
                    if(cur.next==null){
                        last=cur;
                    }
                    cur.next.prev=cur.prev;
                }
            }
            cur=cur.next;
        }
    }
    public void clear(){//清除链表
        ListNode cur=head;
           while(cur!=null){
            ListNode curN=cur.next;
            cur.next=null;
            cur.prev=null;
            cur=curN;
        }
        head=last=null;
    }
}
相关推荐
回忆是昨天里的海18 分钟前
docker常见命令
java·docker·容器
计算机毕设vx_bysj68691 小时前
计算机毕业设计必看必学~Springboot教学进度管理系统,原创定制程序、单片机、java、PHP、Python、小程序、文案全套、毕设成品等!
java·spring boot·vue·课程设计·管理系统
赵财猫._.1 小时前
Native API开发:C++与ArkTS混合编程实战
开发语言·c++·harmonyos
普通网友2 小时前
基于C++的操作系统开发
开发语言·c++·算法
狂团商城小师妹2 小时前
JAVA外卖霸王餐CPS优惠CPS平台自主发布小程序+公众号霸王餐源码
java·开发语言·小程序
2501_941111343 小时前
C++中的策略模式高级应用
开发语言·c++·算法
q***11653 小时前
Spring 中的 @ExceptionHandler 注解详解与应用
java·后端·spring
心软小念3 小时前
用Python requests库玩转接口自动化测试!测试工程师的实战秘籍
java·开发语言·python
u***j3244 小时前
后端服务限流实现,Redis+Lua脚本
java·redis·lua
CoderYanger4 小时前
A.每日一题——2536. 子矩阵元素加 1
java·线性代数·算法·leetcode·矩阵