数据结构与算法(四):双向链表

这篇具有很好参考价值的文章主要介绍了数据结构与算法(四):双向链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本概念

双向链表概念和单向链表是一致的,区别在于双向链表在单向链表的基础上,指针区域多了一个指向上一个节点的指针。单向链表内容可以参考我的上一篇文章:http://t.csdn.cn/Iu56H。
基本的数据结构如图所示:数据结构与算法(四):双向链表

链表结构

双向链表结构包含了节点的数据内容和两个指针:指向前一个节点的preNode,和指向下一个节点的nextNode。

@Data
public class Node {
    // 编号
    private Integer no;
    private String name;
    // 后一个节点
    private Node nextNode;
    // 前一个节点
    private Node preNode;
    public Node(Integer no, String name) {
        this.no = no;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                ", name='" + name + '\'' +
                '}';
    }
}

链表操作

初始化双向链表

private static Node head = new Node(0, "头节点");

打印链表

/**
 * 打印链表
 */
public void showNode() {
    Node temp = head.getNextNode();
    if (temp == null) {
        System.out.println("链表为空");
        return;
    }
    while (true) {
        System.out.println(temp);
        if (temp.getNextNode() == null) {
            break;
        }
        temp = temp.getNextNode();
    }
}

添加节点(无序)

/**
 * 添加节点
 * @param node
 */
public void addNode(Node node) {
    Node temp = head;
    while (true) {
        if (temp.getNextNode() == null) {
            break;
        }
        temp = temp.getNextNode();
    }
    temp.setNextNode(node);
    node.setPreNode(temp);
}

添加节点(按顺序)

当按照编号大小向链表中添加节点时,需要判断当前的节点是否已经是最后一个节点,如果是最后一个节点,咋只需要将原节点的下一个节点指针指向新节点,新节点的上一个节点指针指向原节点即可。
如果新插入的节点位置在链表中部,则需要对原节点的上一个节点和下一个节点都进行相应的赋值处理。

/**
 * 按顺序插入
 * @param node
 */
public void addNodeSort(Node node) {
    Node temp = head;
    while (true) {
        if (temp.getNo() == node.getNo()) {
            System.out.println("节点已存在:" + node.getNo());
            return;
        }
        // 当前节点比新插入的节点大,需要把新节点放到旧节点前面
        if (temp.getNo() > node.getNo()) {
            node.setPreNode(temp.getPreNode());
            temp.getPreNode().setNextNode(node);
            temp.setPreNode(node);
            node.setNextNode(temp);
            return;
        }
        // 最后一个节点
        if (temp.getNextNode() == null) {
            temp.setNextNode(node);
            node.setPreNode(temp);
            return;
        }
        temp = temp.getNextNode();
    }
}

修改节点内容

/**
* 修改节点内容
* @param node
*/
public void updateNode(Node node) {
   Node temp = head;
   boolean isExist = false;
   while (true) {
       // 未找到要修改的节点
       if (temp == null) {
           break;
       }
       if (temp.getNo() == node.getNo()) {
           isExist = true;
           break;
       }
       temp = temp.getNextNode();
   }
   if (isExist) {
       temp.setName(node.getName());
   } else {
       System.out.println("节点未找到");
   }
}

删除节点

如果删除的节点为链表的最后一个节点,将上一个节点的下一节点指针和自己的上一节点指针设置为null即可。如果删除的节点为中间位置,则需要对删除节点的下一个节点值进行相应的操作使其替换掉要删除的节点,这样要删除的节点没有指针指向后会自动被GC回收。文章来源地址https://www.toymoban.com/news/detail-628602.html

/**
* 删除节点
* @param no
*/
public void deleteNode(Integer no) {
   Node temp = head;
   while (true) {
       if (temp == null) {
           System.out.println("节点未找到");
           return;
       }
       if (temp.getNo() == no) {
           // 删除的是最后一个节点
           if (temp.getNextNode() == null) {
               temp.getPreNode().setNextNode(null);
               temp.setPreNode(null);
               return;
           } else {
               temp.getPreNode().setNextNode(temp.getNextNode());
               temp.getNextNode().setPreNode(temp.getPreNode());
               return;
           }
       }
       temp = temp.getNextNode();
   }
}

到了这里,关于数据结构与算法(四):双向链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法】之双向链表及其实现!

    ​                                                                                 个人主页:秋风起,再归来~                                                                                             数据结构与

    2024年04月23日
    浏览(42)
  • 【数据结构与算法】 - 双向链表 - 详细实现思路及代码

    前几篇文章介绍了怎样去实现单链表、单循环链表, 这篇文章主要介绍 双向链表 以及实现双向链表的步骤,最后提供我自己根据理解实现双向链表的C语言代码 。跟着后面实现思路看下去,应该可以看懂代码,看懂代码后,就对双向链表有了比较抽象的理解了,最后自己再

    2024年02月01日
    浏览(39)
  • 【数据结构和算法】实现带头双向循环链表(最复杂的链表)

    前文,我们实现了认识了链表这一结构,并实现了无头单向非循环链表,接下来我们实现另一种常用的链表结构,带头双向循环链表。如有仍不了解单向链表的,请看这一篇文章(7条消息) 【数据结构和算法】认识线性表中的链表,并实现单向链表_小王学代码的博客-CSDN博客

    2024年01月17日
    浏览(78)
  • 【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)

    🎁 单链表的节点中只有一个 next 指针引用着下一个节点的地址 🎁 当要获取单链表中的最后一个元素的时候,需要从头节点开始遍历到最后 🎁 单链表一开始的时候有 first 头指针引用着头节点的地址 💰 双向链表可以提升链表的综合性能 💰 双向链表的节点中有 prev 指针引

    2024年02月12日
    浏览(46)
  • 数据结构课程设计题目——链表综合算法设计、带头双向循环链表、插入、显示、删除、修改、排序

      课程设计题目1–链表综合算法设计   一、设计内容   已知简单的人事信息系统中职工记录包含职工编号(no)、职工姓名(name)、部门名称(depname)、职称(title)和工资数(salary)等信息(可以增加其他信息),设计并完成一个简单的人事信息管理系统,要求完成但不

    2024年02月08日
    浏览(64)
  • 【数据结构与算法】一、数据结构的基本概念

    抽象数据类型(ADT)定义举例:Circle的定义 如何处理杂乱无章且多样化的数据: 数据元素 :数据中的个体被称为数据元素。 数据对象 :性质相同的数据元素组成的集合。 数据结构 :数据元素加上数据元素之间的关系,就形成了数据结构。 逻辑结构 :数据结构的逻辑模型。

    2023年04月17日
    浏览(99)
  • 青岛大学_王卓老师【数据结构与算法】Week04_04_双向链表的插入_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第04周04–2.5.4双向链表2–双向链表

    2024年02月12日
    浏览(58)
  • 【全面突击数据结构与算法001】绪论篇,数据结构的基本概念

    👑 作 者 主 页 :👉CSDN丨博客园 🏆 学 习 交 流 :👉在下周周ovoの社区 💎全 面 突 击 数 据 结 构 与 算 法 系 列 专 栏: 👉 数据结构与算法专栏 PS:本篇文章主要综合了【王道数据结构与算法】与我的个人笔记与理解,如果文章有任何错误欢迎各位大佬的指出 快期末考

    2024年02月07日
    浏览(47)
  • 数据结构-链表结构-双向链表

    双向链表也叫双链表,与单向链表不同的是,每一个节点有三个区域组成:两个指针域,一个数据域 前一个指针域:存储前驱节点的内存地址 后一个指针域:存储后继节点的内存地址 数据域:存储节点数据 以下就是双向链表的最基本单位 节点的前指针域指向前驱,后指针

    2024年02月04日
    浏览(47)
  • 【数据结构】双向奔赴的爱恋 --- 双向链表

    关注小庄 顿顿解馋๑ᵒᯅᵒ๑ 引言:上回我们讲解了单链表(单向不循环不带头链表),我们可以发现他是存在一定缺陷的,比如尾删的时候需要遍历一遍链表,这会大大降低我们的性能,再比如对于链表中的一个结点我们是无法直接访问它的上一个结点,那有什么解决方法呢

    2024年04月08日
    浏览(95)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包