首页 > 其他分享 >双向链表的建立和使用场景

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

时间:2023-10-27 10:01:07浏览次数:33  
标签:Node current 场景 next 链表 双向 节点

双向链表(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. 编辑器和浏览器历史:双向链表可以用于实现文本编辑器的撤销和重做功能,以及浏览器历史记录的前进和后退功能,因为用户可以在双向链表中导航到前一个和后一个状态。

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

标签:Node,current,场景,next,链表,双向,节点
From: https://www.cnblogs.com/gentle-man/p/17791107.html

相关文章

  • 如何实现超大场景三维模型数据坐标转换
    如何实现超大场景三维模型数据坐标转换 要实现超大场景倾斜摄影三维模型数据的坐标转换,可以利用几何坐标变换技术。以下是一种基本的实现方法:1、数据分割:首先,将超大场景划分为多个较小区域,以便进行分块处理。这样做可以减少计算量,并简化坐标转换过程。2、块内坐标转换:对每个......
  • 04_两两交换链表中的节点
    两两交换链表中的节点给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。【思路】/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*......
  • 【BiLSTM-Adaboost预测】基于双向长短期记忆网络的Adaboost时间序列预测研究(matlab代
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • Kafka 在分布式系统中的 7 大应用场景
    Kafka介绍Kafka是一个开源的分布式流式平台,它可以处理大量的实时数据,并提供高吞吐量,低延迟,高可靠性和高可扩展性。Kafka的核心组件包括生产者(Producer),消费者(Consumer),主题(Topic),分区(Partition),副本(Replica),日志(Log),偏移量(Offset)和代理(Broker)。Kafka的主要特点有:数据磁盘持久化:Ka......
  • 面试必刷TOP101:13、判断一个链表是否为回文结构
    一、题目二、题解2.1方法一使用list列表因为需要判断是否为回文结构,所以要比较头尾的数据,而链表无法随机查询数据,所以可以先将链表转换成list。具体步骤首先初始化一个list列表;遍历链表,将链表中的值转移至list中;在list中通过比较头尾的值来判断链表是否为回文结构。代码如下:import......
  • 对话在行人|中裕能源:基于多业态特点,融合创新数智化应用场景
    对话在行人从信息化在行人到数智化在行人,用友持续深耕企业软件与服务产业35年,截至目前已有3.96万家大中型企业选择用友BIP推进数智商业创新。为探索行业数智化成功路径,分享企业数智化领先实践,2023年9月,用友正式推出聚焦行业领先企业数智化转型的高端访谈栏目《对话在行人》。此栏目......
  • AIGC扫盲和应用场景探究
     什么是AIGC?AIGC(ArtificialIntelligenceGeneratedContent)是指利用人工智能技术生成内容的能力。火爆的虚拟数字人,就是AIGC的典型代表,它可以通过学习大量数据和知识,生成与人类创作相似甚至超越人类水平的文本、图像、音频、视频等内容。AIGC是人工智能领域发展的新里程碑,能够加......
  • 03_反转链表
    反转链表给你单链表的头节点head,请你反转链表,并返回反转后的链表。力扣题目链接示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[]提示:链表中节点的数目范围是[0,5000]-5000<=Node.val<=5000思......
  • 单向链表学习总结
        直接上代码了,看着在代码上面建立的链表类,大概可以说出啥是链表,这个是单向链表的一个类,链表有它的链表头,还有结点,建立一个结点类,结点有它的值和指向,指向的代码实现直接赋值Node类,然后链表头也和结点有些关系,因此把头设为结点类,然后弄一个构造函数,方便链表初始化  ......
  • 超大场景的倾斜摄影三维模型的顶层合并构建的必要性分析
    超大场景的倾斜摄影三维模型的顶层合并构建的必要性分析   倾斜摄影三维模型的顶层构建是将倾斜摄影数据转换为精确的三维模型的过程。它具有许多重要的应用和意义,本文将介绍几个主要的原因。一、可视化与漫游倾斜摄影三维模型的顶层构建可以实现对地理场景的精确建模,从......