一、双向链表结构分析及其特点:

双链表结构:双向链表中每一个Node节点含Data域及pre指针(指向上一个节点)、Next指针(指向下一个节点):

特点:

1)双向链表可以双向查找(向前或者向后查找),而单向链表只能沿着一个方向查找

2)双向链表可以进行自我删除,而单向链表需要temp节点才能进行删除

注:关于单链表节点解析及常见面试题分析见博客:https://blog.csdn.net/weixin_54513300/article/details/121308199?spm=1001.2014.3001.5501

二、关于双向链表的增删改demo:

package com.atguigu.linked;public class DoubleLinkedLIstDemo {public static void main(String[] args) {// 测试System.out.println("双向链表的测试");// 先创建节点HeroNode2 hero1 = new HeroNode2(1, "宋江", "及时雨");HeroNode2 hero2 = new HeroNode2(2, "卢俊义", "玉麒麟");HeroNode2 hero3 = new HeroNode2(3, "吴用", "智多星");HeroNode2 hero4 = new HeroNode2(4, "林冲", "豹子头");// 创建一个双向链表DoubleLinkedList doubleLinkedList = new DoubleLinkedList();doubleLinkedList.add(hero1);doubleLinkedList.add(hero2);doubleLinkedList.add(hero3);doubleLinkedList.add(hero4);doubleLinkedList.list();// 修改HeroNode2 newHeroNode = new HeroNode2(4, "公孙胜", "入云龙");doubleLinkedList.update(newHeroNode);System.out.println("修改后的链表情况");doubleLinkedList.list();// 删除doubleLinkedList.del(3);System.out.println("删除后的链表情况~~");doubleLinkedList.list();}}// 创建一个双向链表的类
class DoubleLinkedList {// 先初始化一个头节点, 头节点不要动, 不存放具体的数据private HeroNode2 head = new HeroNode2(0, "", "");// 返回头节点public HeroNode2 getHead() {return head;}// 遍历双向链表的方法// 显示链表[遍历]public void list() {// 判断链表是否为空if (head.next == null) {System.out.println("链表为空");return;}// 因为头节点,不能动,因此我们需要一个辅助变量来遍历HeroNode2 temp = head.next;while (true) {// 判断是否到链表最后if (temp == null) {break;}// 输出节点的信息System.out.println(temp);// 将temp后移, 一定小心temp = temp.next;}}// 添加一个节点到双向链表的最后.public void add(HeroNode2 heroNode) {// 因为head节点不能动,因此我们需要一个辅助遍历 tempHeroNode2 temp = head;// 遍历链表,找到最后while (true) {// 找到链表的最后if (temp.next == null) {//break;}// 如果没有找到最后, 将将temp后移temp = temp.next;}// 当退出while循环时,temp就指向了链表的最后// 形成一个双向链表temp.next = heroNode;heroNode.pre = temp;}// 修改一个节点的内容, 可以看到双向链表的节点内容修改和单向链表一样// 只是 节点类型改成 HeroNode2public void update(HeroNode2 newHeroNode) {// 判断是否空if (head.next == null) {System.out.println("链表为空~");return;}// 找到需要修改的节点, 根据no编号// 定义一个辅助变量HeroNode2 temp = head.next;boolean flag = false; // 表示是否找到该节点while (true) {if (temp == null) {break; // 已经遍历完链表}if (temp.no == newHeroNode.no) {// 找到flag = true;break;}temp = temp.next;}// 根据flag 判断是否找到要修改的节点if (flag) {temp.name = newHeroNode.name;temp.nickname = newHeroNode.nickname;} else { // 没有找到System.out.printf("没有找到 编号 %d 的节点,不能修改\n", newHeroNode.no);}}// 从双向链表中删除一个节点,// 说明// 1 对于双向链表,我们可以直接找到要删除的这个节点// 2 找到后,自我删除即可public void del(int no) {// 判断当前链表是否为空if (head.next == null) {// 空链表System.out.println("链表为空,无法删除");return;}HeroNode2 temp = head.next; // 辅助变量(指针)boolean flag = false; // 标志是否找到待删除节点的while (true) {if (temp == null) { // 已经到链表的最后break;}if (temp.no == no) {// 找到的待删除节点的前一个节点tempflag = true;break;}temp = temp.next; // temp后移,遍历}// 判断flagif (flag) { // 找到// 可以删除// temp.next = temp.next.next;[单向链表]temp.pre.next = temp.next;// 这里我们的代码有问题?// 如果是最后一个节点,就不需要执行下面这句话,否则出现空指针if (temp.next != null) {temp.next.pre = temp.pre;}} else {System.out.printf("要删除的 %d 节点不存在\n", no);}}}

双向链表Demo测试总结:

1)增加node:通过node.next==null找到最后一个节点temp,令temp.next=new Node,new Node.pre=temp;

2)删除节点:找到目标节点temp,将目标节点下一个节点的pre指针改成目标节点上一个节点,目标节点上一个节点的next指针改成目标节点的下一个节点即可,即:temp.pre.next=temp.next,temp.next.pre=temp.pre

3)修改节点:找到目标节点node,修改node节点Data域即可;

数据结构与算法详细解析之双链表结构解析相关推荐

  1. 数据结构和算法(四)之链表结构

    数据结构和算法(四)之链表结构 一. 认识链表 链表和数组一样,可以用来存储一系列的元素,但是链表和数组的实现机制完全不同. 这一章中,我们就来学习一下另外一种非常常见的用于存储数据的线性结构:链表! ...

  2. 【一起学数据结构与算法】Java实现双链表

    目录 一.双链表的概念 二.双链表一些方法的实现 2.1 双链表的属性 2.2 打印双链表 2.3 得到双链表的长度 2.4 查找是否包含关键字key是否在双链表中 2.5 头插法 2.6 尾插法 2 ...

  3. 【数据结构与算法】实验 编写双链表的结点查找和删除算法

    Experiment 1 Linked List(4 hours) Prerequisites: Students should have mastered the following prerequ ...

  4. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  5. 浅谈:数据结构之双链表结构与代码模拟双链表的实现

    双链表 本文是观看尚硅谷韩老师数据结构与算法根据老师讲解自己做的笔记,部分信息收集网络 与单链表区别 逻辑上没有区别.他们均是完成线性表的内容.主要的区别是结构上的构造有所区别. 对于单链表: 对于一 ...

  6. java数据结构与算法之顺序表与链表深入分析

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结 ...

  7. 数据结构与算法(二)单链表(Singly linked list)

    数据结构与算法(二)单链表(Singly linked list) 链表(Linked list) Python完整功能实现 LeetCode思想实践: 链这个东西大家一定都不陌生, 脖子上有项链, ...

  8. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  9. java环形链表_数据结构和算法(四)Java实现环形链表

    1. 数据结构和算法(四)Java实现环形链表 1.1 约瑟夫问题 约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中 ...

最新文章

  1. CSDN博客图片水印|自定义水印|去除水印
  2. 二、kubernetes
  3. 在Windows端安装kafka提示错误:找不到或无法加载主类的解决方案
  4. [论文阅读] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
  5. 【QT】QT从零入门教程(十二):实现工具箱QButtonGroup
  6. 【MYSQL笔记】复制删除和表和记录
  7. 阿里云asp主机 后台登录一直提示验证码错误_拖欠阿里云一分钱,结果?
  8. javafx弹出二级stage窗口时虚化主窗口
  9. XP下 无法定位程序输入点WSAPoll于动态链接库ws2_32.dll 的解决办法
  10. UCI数据集介绍(论文常用数据集)
  11. Android 开机时间慢问题debug
  12. 柳传志:我是任正非的知音
  13. lcd1602显示和led显示的区别在哪里
  14. pytorch实现风格迁移 style transfer
  15. java 初始化数组_java如何实现数组初始化
  16. [网络安全课程实验]:PGP加密解密
  17. 论文翻译 | RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds
  18. SpringBoot2核心技术最好的一篇文章——1.基础入门
  19. 【读书笔记】《牧羊少年奇幻之旅》
  20. cnpm安装 指定版本_vue npm install安装某个指定版本的方法

热门文章

  1. C 喵帕斯之天才算数少女 SDUT
  2. linux 分区 物理卷 逻辑卷
  3. Adams/Car和Matlab联合仿真
  4. VB编写欧姆龙PLC和霍尼韦尔扫描枪 的串口调试程序,可供大家参考
  5. 湖南农业大学企业邮箱申请
  6. win10很多软件显示模糊_显示字体小到有些模糊?高分屏别忘了这些设置
  7. 数据结构——判断题错误合集
  8. XBOX之Kinect1与2的区别
  9. android hide方法 末班,Android调用@hide系统隐藏类的几种方法
  10. 友盟第三方登录 无法切换账号 退出 取消授权