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;
    }
}
相关推荐
自学AI的鲨鱼儿1 分钟前
ubuntu22.04安装gvm管理go
开发语言·后端·golang
晓宜13 分钟前
Java25 新特性介绍
java·python·算法
旭意15 分钟前
C++微基础备战蓝桥杯之数组篇10.1
开发语言·c++·蓝桥杯
Seven9725 分钟前
SpringIOC、DI及Bean线程安全面试题解析
java
TitosZhang27 分钟前
BIO、NIO、AIO详解
java·redis·nio
Arva .44 分钟前
Spring Boot 配置文件
java·spring boot·后端
IT_Octopus44 分钟前
https私人证书 PKIX path building failed 报错解决
java·spring boot·网络协议·https
MediaTea1 小时前
Python:匿名函数 lambda
开发语言·python
R-G-B1 小时前
【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件
开发语言·c#·c# 多个 .cs文件项目
程序员清风1 小时前
网易三面:Java中默认使用的垃圾回收器及特点分版本说说?
java·后端·面试