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;
    }
}
相关推荐
邪修king6 小时前
Re:Linux 系统篇(三十五):进程间通信Chapter2:从匿名管道到进程池:Linux 进程间通信实战(深度理解「先描述,再组织」)
java·linux·运维
拆房老料6 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
张张123y7 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
阿里嘎多学长11 小时前
2026-10-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
曹牧12 小时前
C#:空合并运算符
java·前端·数据库
布吉岛的石头12 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
golang学习记12 小时前
IDEA 2026年的玩法已经完全不同
java·ide·intellij-idea
小羊没烦恼!12 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
紧跟先前的步伐13 小时前
Go AI Agent 实战 05|Temperature 与生成参数:让模型输出可控
java·人工智能·golang
金銀銅鐵13 小时前
[Java] 展示添加元素时 ArrayList 的内部变化
java·后端·ai编程