java - 数据结构,双向链表 - LinkedList

本文探讨了双向链表的特性,与单链表的区别,并详细介绍了如何在Java中模拟实现双向链表,包括节点类的设计、链表类的实现,以及一系列如插入、删除、查找等操作。同时,文章还比较了链表与顺序表在数据组织和操作上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、双向链表 (不带头)

无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表
在这里插入图片描述

  • 双向链表 和 单向链表的区别,就在于 双向 比 单向 多个 一个前驱地址。而且 你会发现 正因为有了前驱地址,所以所以这个链表,它有两种走向,这也是这个链表为什么叫做双向链表的原因之一

首先看看单链表是如何删除节点的

在这里插入图片描述
总结:
   单向链表在删除一个节点的时候,需要借助前驱节点,才能删除。

双向链表是如何删除节点的

双向链表删除节点,不需要借助前驱节点
因为双向链表,它存储前驱和后驱的节点的地址,它都知道。
另外双向链表会多一个引用last,这个引用永远指向此时链表的尾巴节点
head就是永远指向双向链表的头节点。

在这里插入图片描述

二、模拟实现双向链表

2.1、实现一个类,来表示双向链表的节点

class ListNode{
   
    //存储int类型的数据
    public int val;
    //存储上一个节点的地址
    public ListNode prev;
    //存储下一个节点的地址
    public ListNode next;
    
    public ListNode(int val){
   
        //构造方法
        this.val = val;
    }
}

2.2、实现一个类,来表示双向链表

public class MyLinkedList {
   
    //指向双向链表的头结点
    public ListNode head;
    //指向双向链表的尾巴节点
    public ListNode last;

    //头插法
    public void addFirst(int data){
   
        
    };
    //尾插法
    public void addLast(int data){
   
        
    };
    //任意位置插入,第一个数据节点为0号下标
    public boolean addIndex(int index,int data){
   
        return true;
    };
    //查找是否包含关键字key是否在单链表当中
    public boolean contains(int key){
   
        return true;
    };
    //删除第一次出现关键字为key的节点
    public void remove(int key){
   
        
    };
    //删除所有值为key的节点
    public void removeAllKey(int key){
   
        
    };
    //得到单链表的长度
    public int size(){
   
        return 0;
    };
    public void display(){
   
        
    };
    public void clear(){
   
        
    };
}

实现LinkedList中的所有方法
通过这些方法就可以操作链表

打印链表

//打印链表
    public void display(){
   
        ListNode cur = this.head;
        while(cur != null){
   
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    };

得到链表的长度

//得到链表的长度
    public int size(){
   
        ListNode cur = this.head;
        int count = 0;
        while(cur != null){
   
            count++;
            cur = cur.next;
        }
       return count;
    };

查找是否包含关键字key是否在单链表当中

//查找是否包含关键字key是否在单链表当中
//找到返回true,找不到返回false
    public boolean contains(int key){
   
        ListNode cur = this.head;
        while (cur != null){
   
            if(cur.val == key){
   
                return true;
            }
            cur = cur.next;
        }
        return false;
    };

头插法

//头插法
    public void addFirst(int data){
   
        ListNode node = new<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Später321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值