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;
    }
}
相关推荐
TT哇几秒前
【Java EE初阶】计算机是如何⼯作的
java·redis·java-ee
专注VB编程开发20年7 分钟前
javascript的类,ES6模块写法在VSCODE中智能提示
开发语言·javascript·vscode
Fireworkitte7 小时前
Apache POI 详解 - Java 操作 Excel/Word/PPT
java·apache·excel
weixin-a153003083167 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
DCTANT7 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
Touper.7 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端
黄雪超7 小时前
JVM——函数式语法糖:如何使用Function、Stream来编写函数式程序?
java·开发语言·jvm
ThetaarSofVenice7 小时前
对象的finalization机制Test
java·开发语言·jvm
思则变8 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
lijingguang8 小时前
在C#中根据URL下载文件并保存到本地,可以使用以下方法(推荐使用现代异步方式)
开发语言·c#