双向链表

对比

**1)**单向链表,查找的方向只能是一一个方向,而双向链表可以向前或者向后查找。
**2)**单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp的前一个节点来删除的

我们的双向链表增加了一个节点:pre 指向前一个节点,加上我们的next,指向下一个节点,就是双向的了

遍历像单链表一样,只不过能可以向前,也可以向后

添加

先找到双向链表的最后这个节点

temp.next = newHeroNode;

newHeroNode.pre = temp;

修改

和原来的单向链表一样

删除

因为是双向链表,因此我们可以实现自我删除某个节点

直接找到要删除的这个节点,比如是temp

temp.pre.next = temp.next 前一个节点的下一个节点,变成了要删除的节点的下一个节点

temp.next.pre = temp.pre 后面那个节点的前一个节点,变成本节点的前一个节点

代码实现

package com.wang.linkedlist;/*** @author 王庆华* @version 1.0* @date 2020/12/4 22:33* @Description TODO* @pojectname 算法代码*/
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, "林冲", "豹子头");DoubleLinkedtList doubleLinkedList = new DoubleLinkedtList();doubleLinkedList.add(hero1);doubleLinkedList.add(hero2);doubleLinkedList.add(hero3);doubleLinkedList.add(hero4);System.out.println("双向链表打印");doubleLinkedList.findAllList();System.out.println("修改测试");HeroNode2 heroNode = new HeroNode2(4,"公孙胜","入云龙");doubleLinkedList.update(heroNode);doubleLinkedList.findAllList();System.out.println("删除3测试");doubleLinkedList.delete(3);doubleLinkedList.findAllList();}
}
//创建一个双向链表
class DoubleLinkedtList{//初始化双向链表private HeroNode2 head = new HeroNode2(0,"","");//返回头结点public HeroNode2 getHead(){return head;}//添加操作public void add(HeroNode2 heroNode){//因为我们的头结点head不能移动,因此我们需要一个辅助变量tempHeroNode2 temp = head;//遍历链表,找到最后while(true){//找到最后if (temp.next == null){break;}//不是最后,指针后裔temp = temp.next;}//档推出while循环时,temp就指向了链表最后//形成一个双向链表temp.next = heroNode;heroNode.pre = temp;}//修改双向链表内容//修改链表public void update(HeroNode2 heroNode){//判断是否为空if (head.next == null){System.out.println("链表为空");return;}//找到需要修改的编号//用一个辅助节点,可以看到,我们只是把节点类型改了一下,其他的和单链表操作一样HeroNode2 temp = head.next;boolean flag = false;while (true){if (temp == null){break;//遍历结束}if (temp.no == heroNode.no){//找到我们的修改位置flag = true;break;}temp = temp.next;}//根据flag判断是否找到节点if (flag){temp.name = heroNode.name;temp.nickname = heroNode.nickname;}else {System.out.println("没有找到"+heroNode.no+"的英雄");}}//删除节点public void delete(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){//找到了待删除的节点flag = true;break;}temp = temp.next;}//判断flagif (flag){//可以删除//单向链表的删除方式temp.next = temp.next.next;temp.pre.next = temp.next;//有风险,如果是最后一个节点呢,最后一个节点没有下一个节点了if (temp.next != null) {temp.next.pre = temp.pre;}}else {System.out.println("要删除的"+no+"不存在");}}//遍历双向链表//显示链表public void findAllList() {//先判断链表是否为空if (head.next == null) {System.out.println("链表为空");return;}//因为头结点不能动,因此需要一个辅助变量来遍历HeroNode2 temp = head.next;while (true) {//是否为最后if (temp.next == null) {System.out.println(temp);break;}//输出节点信息System.out.println(temp);//将指针后裔temp = temp.next;}}}
class HeroNode2{public int no;public String name;public String nickname;public  HeroNode2 next;//指向下一个节点public HeroNode2 pre;//指向前一个节点//构造器public HeroNode2(int no,String name,String nickname){this.no = no;this.name = name;this.nickname = nickname;}//重写我们的toString方法@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\'' +'}';}
}

数据结构-----双向链表笔记相关推荐

  1. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21

    大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...

  2. 数据结构 — 双向链表

    目录 文章目录 目录 双向链表 双向链表结点的数据结构 双向链表的操作集合 应用示例 创建双向链表 清理双向链表 查询链表结点 更新链表结点的数据 插入链表结点 删除结点 打印链表数据 双向链表 双向 ...

  3. 数据结构学习笔记(七):哈希表(Hash Table)

    目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...

  4. 数据结构学习笔记(六):二叉树(Binary Tree)

    目录 1 背景知识:树(Tree) 2 何为二叉树(Binray Tree) 2.1 二叉树的概念与结构 2.2 满二叉树与完全二叉树 2.3 二叉树的三种遍历方式 3 二叉树及其遍历的简单实现(Ja ...

  5. 数据结构学习笔记(五):重识字符串(String)

    目录 1 字符串与数组的关系 1.1 字符串与数组的联系 1.2 字符串与数组的区别 2 实现字符串的链式存储(Java) 3 子串查找的简单实现 1 字符串与数组的关系 1.1 字符串与数组的联系 ...

  6. 数据结构学习笔记(四):重识数组(Array)

    目录 1 数组通过索引访问元素的原理 1.1 内存空间的连续性 1.2 数据类型的同一性 2 数组与链表增删查操作特性的对比 2.1 数组与链表的共性与差异 2.2 数组与链表增删查特性差异的原理 3 ...

  7. 数据结构学习笔记——顺序表的基本操作(超详细最终版+++)建议反复看看ヾ(≧▽≦*)o

    目录 前言 一.顺序表的定义 二.顺序表的初始化 三.顺序表的建立 四.顺序表的输出 五.顺序表的逆序输出 六.顺序表的插入操作 七.顺序表的删除操作 八.顺序表的按位和按值查找 基本操作的完整代码 ...

  8. Python数据结构学习笔记——链表:无序链表和有序链表

    目录 一.链表 二.无序链表 实现步骤分析 三.无序链表的Python实现代码 四.有序链表 实现步骤分析 五.有序链表的Python实现代码 结语 一.链表 链表中每一个元素都由为两部分构成:一是该 ...

  9. Python数据结构学习笔记——队列和双端队列

    目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...

  10. Python数据结构学习笔记——栈

    目录 一.栈的定义和特性 (一)栈的定义 (二)栈的反转特性 二.实现分析步骤 三.栈的Python实现代码 四.栈的应用 (一)匹配圆括号 (二)匹配符号 (三)模2除法(十进制转二进制) (四)进 ...

最新文章

  1. 【深度学习】数形结合的图像处理(文末介绍了一种新型网络)
  2. 详解JavaScript中ES5和ES6的类、继承之间区别和联系
  3. 用python爬虫抓站的一些技巧总结
  4. 【算法知识】详解堆排序算法
  5. python中yield的用法
  6. 两种方法用于检查传入的数字是否为整数
  7. 软件网络协议测试,网络协议测试方法是什么
  8. python提取英文单词 每行显示一个_使用python对文件中的单词进行提取
  9. 2012年9月计算机二级c语言,2012 年9月 全国计算机二级c语言试题
  10. c++ 正则表达式_Python教程:进程和线程amp;正则表达式
  11. sprintf函数打印数据不对_printf的归宿-数据打印到哪儿了
  12. RequiredFieldValidator验证下拉列表框
  13. 密码学 双线性映射
  14. matlab牛头刨床矩阵,MATLAB牛头刨床分析程序-课程设计
  15. 每日算法刷题Day3-起始时间转换、二次方根、while连续输入、斐波那契思路
  16. 手把手教你用Java获取IP归属地
  17. 手游天龙八部服务器注册上限,腾讯手游助手注册已达上限怎么办 | 手游网游页游攻略大全...
  18. wavin flag by k'naan
  19. mt4和mt5的区别
  20. TypeScript学习总结

热门文章

  1. android 图片方向,Android图片处理:识别图像方向并显示实例教程
  2. SQL:pgsql新建数据表
  3. Javascript:利用闭包实现高级排他
  4. CSS:position属性和z_index
  5. 论文笔记_S2D.64_2021_MonoRec_动态环境下单目移动相机的半监督稠密重建
  6. SLAM基础_从零开始一起学习SLAM | 为啥需要李群与李代数?
  7. 论文笔记_S2D.36_2017-CVPR_CNN-SLAM: 实时稠密单目SLAM与学习深度预测
  8. ML/DL-复习笔记【十】- 分组卷积和深度可分离卷积的区别
  9. VS2013中为C++程序生成lib和dll文件
  10. 使用BAPI批量修改采购信息记录的税率