数据结构-----双向链表笔记
双向链表
对比
**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 第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 第 ...
- 数据结构 — 双向链表
目录 文章目录 目录 双向链表 双向链表结点的数据结构 双向链表的操作集合 应用示例 创建双向链表 清理双向链表 查询链表结点 更新链表结点的数据 插入链表结点 删除结点 打印链表数据 双向链表 双向 ...
- 数据结构学习笔记(七):哈希表(Hash Table)
目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...
- 数据结构学习笔记(六):二叉树(Binary Tree)
目录 1 背景知识:树(Tree) 2 何为二叉树(Binray Tree) 2.1 二叉树的概念与结构 2.2 满二叉树与完全二叉树 2.3 二叉树的三种遍历方式 3 二叉树及其遍历的简单实现(Ja ...
- 数据结构学习笔记(五):重识字符串(String)
目录 1 字符串与数组的关系 1.1 字符串与数组的联系 1.2 字符串与数组的区别 2 实现字符串的链式存储(Java) 3 子串查找的简单实现 1 字符串与数组的关系 1.1 字符串与数组的联系 ...
- 数据结构学习笔记(四):重识数组(Array)
目录 1 数组通过索引访问元素的原理 1.1 内存空间的连续性 1.2 数据类型的同一性 2 数组与链表增删查操作特性的对比 2.1 数组与链表的共性与差异 2.2 数组与链表增删查特性差异的原理 3 ...
- 数据结构学习笔记——顺序表的基本操作(超详细最终版+++)建议反复看看ヾ(≧▽≦*)o
目录 前言 一.顺序表的定义 二.顺序表的初始化 三.顺序表的建立 四.顺序表的输出 五.顺序表的逆序输出 六.顺序表的插入操作 七.顺序表的删除操作 八.顺序表的按位和按值查找 基本操作的完整代码 ...
- Python数据结构学习笔记——链表:无序链表和有序链表
目录 一.链表 二.无序链表 实现步骤分析 三.无序链表的Python实现代码 四.有序链表 实现步骤分析 五.有序链表的Python实现代码 结语 一.链表 链表中每一个元素都由为两部分构成:一是该 ...
- Python数据结构学习笔记——队列和双端队列
目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...
- Python数据结构学习笔记——栈
目录 一.栈的定义和特性 (一)栈的定义 (二)栈的反转特性 二.实现分析步骤 三.栈的Python实现代码 四.栈的应用 (一)匹配圆括号 (二)匹配符号 (三)模2除法(十进制转二进制) (四)进 ...
最新文章
- 【深度学习】数形结合的图像处理(文末介绍了一种新型网络)
- 详解JavaScript中ES5和ES6的类、继承之间区别和联系
- 用python爬虫抓站的一些技巧总结
- 【算法知识】详解堆排序算法
- python中yield的用法
- 两种方法用于检查传入的数字是否为整数
- 软件网络协议测试,网络协议测试方法是什么
- python提取英文单词 每行显示一个_使用python对文件中的单词进行提取
- 2012年9月计算机二级c语言,2012 年9月 全国计算机二级c语言试题
- c++ 正则表达式_Python教程:进程和线程amp;正则表达式
- sprintf函数打印数据不对_printf的归宿-数据打印到哪儿了
- RequiredFieldValidator验证下拉列表框
- 密码学 双线性映射
- matlab牛头刨床矩阵,MATLAB牛头刨床分析程序-课程设计
- 每日算法刷题Day3-起始时间转换、二次方根、while连续输入、斐波那契思路
- 手把手教你用Java获取IP归属地
- 手游天龙八部服务器注册上限,腾讯手游助手注册已达上限怎么办 | 手游网游页游攻略大全...
- wavin flag by k'naan
- mt4和mt5的区别
- TypeScript学习总结
热门文章
- android 图片方向,Android图片处理:识别图像方向并显示实例教程
- SQL:pgsql新建数据表
- Javascript:利用闭包实现高级排他
- CSS:position属性和z_index
- 论文笔记_S2D.64_2021_MonoRec_动态环境下单目移动相机的半监督稠密重建
- SLAM基础_从零开始一起学习SLAM | 为啥需要李群与李代数?
- 论文笔记_S2D.36_2017-CVPR_CNN-SLAM: 实时稠密单目SLAM与学习深度预测
- ML/DL-复习笔记【十】- 分组卷积和深度可分离卷积的区别
- VS2013中为C++程序生成lib和dll文件
- 使用BAPI批量修改采购信息记录的税率