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;
    }
}
相关推荐
Rabbit_QL4 小时前
【水印添加工具】从零设计一个工程级 Python 图片水印工具:WaterMask 架构与实现
开发语言·python
张柏慈4 小时前
Java性能优化:实战技巧与案例解析
java
天“码”行空4 小时前
简化Lambda——方法引用
java·开发语言
z20348315204 小时前
C++对象布局
开发语言·c++
Beginner x_u5 小时前
如何解释JavaScript 中 this 的值?
开发语言·前端·javascript·this 指针
带刺的坐椅5 小时前
MCP 进化:让静态 Tool 进化为具备“上下文感知”的远程 Skills
java·ai·llm·agent·solon·mcp·tool-call·skills
java1234_小锋5 小时前
Java线程之间是如何通信的?
java·开发语言
张张努力变强5 小时前
C++ Date日期类的设计与实现全解析
java·开发语言·c++·算法
feifeigo1236 小时前
基于EM算法的混合Copula MATLAB实现
开发语言·算法·matlab
LYS_06186 小时前
RM赛事C型板九轴IMU解算(4)(卡尔曼滤波)
c语言·开发语言·前端·卡尔曼滤波