双向链表的建立和使用场景

简介: 双向链表的建立和使用场景



       双向链表(Doubly Linked List)是一种常见的数据结构,它在链表的基础上增加了一个指向前一个节点的指针,这使得在双向链表中可以方便地进行双向遍历。

创建双向链表的步骤

       定义节点类:首先,定义一个节点类,这个节点类通常包含三个属性:数据域(存储数据的部分)、指向下一个节点的指针(通常称为nextforward),以及指向前一个节点的指针(通常称为prevbackward)。

//定义一个节点类
public class Node {
    //数据域
    int data;
    //指向下一个节点的指针
    Node next;
    //指向前一个节点的指针
    Node prev;
    
    public Node(int data) {
        this.data=data;
        this.next=null;
        this.prev=null;
    }
}

       创建链表:创建一个链表对象,通常包括一个指向链表头部和尾部的指针。该类包含链表的操作方法,如添加节点、删除节点等。

public class DoublyLinkedList {
    //创建一个链表对象,通常包括一个指向链表头部和尾部的指针
    private Node head;
    private Node tail;
    public DoublyLinkedList() {
        this.head=null;
        this.tail=null;
    }
    //添加节点
    public void append(int data) {
        Node newNode=new Node(data);
        if (tail==null) {
            head=newNode;
            tail=newNode;
        }else {
            //更新 prev 和 next 指针
            tail.next=newNode;
            newNode.prev=tail;
            tail=newNode;
        }
    }
    public void display() {
        Node current=head;
        while(current!=null) {
            System.out.print(current.data+"<->");
            current=current.next;
        }
        System.out.println("null");
    }
    //删除节点
    public void remove(int target) {
        Node current=head;
        while(current!=null) {
            if(current.data==target) {
                //更新相邻节点的指针
                //如果当前结点为头结点,将头结点引用指向下一个
                if(current.prev!=null) {
                    current.prev.next=current.next;
                }else {
                    head=current.next;
                }
                //如果当前结点为尾结点,将尾结点引用指向上一个
                if(current.next!=null) {
                    current.next.prev=current.prev;
                }else {
                    tail=current.prev;
                }
                return;
            }
            current=current.next;
        }
        System.out.println("没找到该结点");
    }
}

       链表的使用:添加结点以及删除结点

public class Test {
    public static void main(String[] args) {
        DoublyLinkedList linkedList=new DoublyLinkedList();
        //添加四个结点
        linkedList.append(1);
        linkedList.append(2);
        linkedList.append(3);
        linkedList.append(4);
        linkedList.display();//1<->2<->3<->4<->null
        linkedList.remove(3);
        linkedList.display();//1<->2<->4<->null
    }
}

适用场景

  1. 双向遍历:由于双向链表具有前向和后向指针,可以方便地进行双向遍历,这在某些算法和数据结构操作中很有用。
  2. 插入和删除:插入和删除节点的操作在双向链表中通常比单链表更高效,因为它不需要在删除节点时回溯到前一个节点。
  3. LRU缓存:双向链表常用于实现LRU(Least Recently Used)缓存淘汰策略,其中最近使用的元素移动到链表的尾部,最不常用的元素位于链表的头部,当缓存满时,可以轻松删除链表头部的元素。
  4. 编辑器和浏览器历史:双向链表可以用于实现文本编辑器的撤销和重做功能,以及浏览器历史记录的前进和后退功能,因为用户可以在双向链表中导航到前一个和后一个状态。

       总之,双向链表在需要双向遍历、频繁插入和删除节点或实现某些特定数据结构时非常有用。然而,由于它需要额外的指针来维护前向链接,可能会占用更多的内存空间。所以在选择数据结构时,需要根据具体需求权衡其优点和缺点。

相关文章
|
C++ 容器
掌握C++定时器:构建自己的定时器的分步指南
本文是一份详细的、分步指南,旨在帮助读者掌握C++定时器的构建过程。通过本文,读者将了解到什么是定时器,以及为什么需要自己构建定时器而不仅仅使用标准库中的函数。文章将从基础开始,介绍了利用C++的基本语法和操作符创建一个简单的定时器的步骤。随后,文章逐渐深入,介绍了如何优化定时器的性能,包括减少延迟和提高精度。
1154 0
|
Ubuntu 关系型数据库 MySQL
M1 macos docker获取x86 x64 amd 等指定架构版本linux ubuntu mysql 容器并启动容器
M1 macos docker获取x86 x64 amd 等指定架构版本linux ubuntu mysql 容器并启动容器
|
虚拟化 索引
看一下ARM的IP:SMMUU
看一下ARM的IP:SMMUU
1336 1
|
测试技术 异构计算
【FPGA基础入门实践】Verilog 基本项目操作逐步演示
【FPGA基础入门实践】Verilog 基本项目操作逐步演示
855 0
|
人工智能 自然语言处理 Rust
【内附榜单】评估AI大模型的代码修复能力!Multi-SWE-bench:字节开源代码修复能力评估基准,覆盖7大主流编程语言
Multi-SWE-bench是首个覆盖Python外7种主流编程语言的代码修复基准,包含1632个真实GitHub问题样本,通过严格筛选与人工验证确保数据质量。
1354 0
【内附榜单】评估AI大模型的代码修复能力!Multi-SWE-bench:字节开源代码修复能力评估基准,覆盖7大主流编程语言
|
10月前
|
Ubuntu Unix Linux
在Windows上轻松安装和使用Ubuntu的方法详解
继续点击“Continue”按钮以继续安装流程,随后选择清理磁盘并安装操作系统的选项。 接下来,在安装过程中,你需要选择时区。为了与你的地理位置相匹配,请选择中国上海作为你的时区设置。 在安装过程中,你还需要设置计算机的名称以及账号密码。请务必牢记这些信息,因为它们将作为你登录系统的凭证。
|
人工智能 运维 搜索推荐
CodeBuddy助力数学教学:数学老师直呼内行!
本文探讨AI在数学教学中的应用,解决传统教学中公式编辑耗时、互动题型开发难、学情分析不精准等问题。通过智能生成教学资源、设计互动题型、精准学情分析和个性化资源定制四大功能,大幅提升教学效率与质量。实际案例展示AI生成交互式函数图像课件和立体几何动态模型工具的效果。对比显示,AI辅助教学显著优于传统模式,助力教育数字化转型,推动精准化教学与教研资源共享。
862 0
|
存储 缓存 Java
程序员必懂!上下文切换到底是怎么回事?
大家好,我是小米,一个喜欢分享技术的程序员。今天聊聊社招面试中的高频考点——上下文切换。它指CPU在多个任务间切换时保存和恢复状态的过程,常见于进程、线程切换及中断处理。上下文切换有CPU时间开销、缓存失效、内存开销等代价。优化方法包括减少线程数量、选择合适的并发模型、优化锁使用等。理解这些不仅能提升面试表现,还能写出更高效的代码。欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
598 6
|
机器学习/深度学习 算法 Python
随机森林算法是一种强大的集成学习方法,通过构建多个决策树并综合其结果进行预测。
随机森林算法是一种强大的集成学习方法,通过构建多个决策树并综合其结果进行预测。本文详细介绍了随机森林的工作原理、性能优势、影响因素及调优方法,并提供了Python实现示例。适用于分类、回归及特征选择等多种应用场景。
1078 7