浅谈:数据结构之双链表结构与代码模拟双链表的实现
双链表
本文是观看尚硅谷韩老师数据结构与算法根据老师讲解自己做的笔记,部分信息收集网络
与单链表区别
逻辑上没有区别。他们均是完成线性表的内容。主要的区别是结构上的构造有所区别。 对于单链表:
对于一个节点,有储存数据的data。和next后驱节点(指针)。也就是这个单链表想要一些遍历的操作都得通过前节点—>后节点。
对于双链表:
对于一个节点,有些和单链表一样有存储数据的data,指向后方的next(指针)。它拥有单链表的所有操作和内容。但是他还有一个前驱节点pre(指针)。
双向链表应用实例
双向链表的操作分析和实现
使用带 head 头的双向链表实现
管理单向链表的缺点分析:
- 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。
- 单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除
时节点,总是找到 temp,temp 是待删除节点的前一个节点(认真体会). 3) 分析了双向链表如何完成遍历,添加,修改和删除的思路
对上图的说明:
分析 双向链表的遍历,添加,修改,删除的操作思路===》代码实现 - 遍历 方和 单链表一样,只是可以向前,也可以向后查找
- 添加 (默认添加到双向链表的最后)
(1) 先找到双向链表的最后这个节点
(2) temp.next = newHeroNode
(3) newHeroNode.pre = temp; - 修改 思路和 原来的单向链表一样. 4) 删除
(1) 因为是双向链表,因此,我们可以实现自我删除某个节点
(2) 直接找到要删除的这个节点,比如 temp
(3) temp.pre.next = temp.next
(4) temp.next.pre = temp.pre;
代码解释
package com.fs.demo_2020_07_14_DoubleLinkedList;import java.util.Stack;/*** 双链表 演示*/
public class SingleDoubleLinkedListDemo {public static void main(String[] args) {//测试双链表的增删改查SingleDoubleLinkedList singleDoubleLinkedList = new SingleDoubleLinkedList();//创建节点System.out.println("---------添加4个节点(1,2,3,4)------------");Node node1 = new Node(1, "节点一");Node node2 = new Node(2, "节点二");Node node3 = new Node(3, "节点三");Node node4 = new Node(4, "节点四");//添加节点singleDoubleLinkedList.add(node1);singleDoubleLinkedList.add(node2);singleDoubleLinkedList.add(node3);singleDoubleLinkedList.add(node4);//显示一把System.out.println("----------------测试遍历双向链表---------------");singleDoubleLinkedList.showLinkedList();System.out.println("---------------测试添加节点到双链表的最后----------------------");Node node5 = new Node(5, "节点五");singleDoubleLinkedList.add(node5);//显示一把singleDoubleLinkedList.showLinkedList();System.out.println("----------删除节点为3的---------------");singleDoubleLinkedList.delNode(3);//显示一把singleDoubleLinkedList.showLinkedList();System.out.println("-----------修改节点5的数据为测试节点----------");singleDoubleLinkedList.updateByNum(new Node(5,"测试节点"));//显示一把singleDoubleLinkedList.showLinkedList();}}//创建一个类来模拟双链表
class SingleDoubleLinkedList {//先初始化一个头节点,头节点不动,不存放具体信息private Node headNode = new Node(0, "头结点");//生成一个get方法 返回头结点,便于后面的测试方法拿头结点测试public Node getHeadNode() {return headNode;}/*一 添加一个节点到双链表的最后思路:*/public void add(Node node) {//拿到初始化的头结点,作为辅助遍历tempNode temp = headNode;//遍历链表,找到最后的节点while (true) {//由图解得知,单链表当遍历到最后一个节点后,next存储的值为null.因为没有下一个节点可以存储了if (temp.next == null) {//那就停止循环break;}//如果没有找到最后,那就将temp后移一个节点temp = temp.next;}//循环结束后,所明temp到达最后一个节点了,那么就在最后一个节点后添加数据,将temp的next存储添加的节点值temp.next = node;//将指针指到的这个节点的next指向添加的节点node.pre = temp;//将添加的节点的pre指向temp}/*三 修改节点信息,根据num来修改,但是num不能修改,只能修改num节点的name*/public void updateByNum(Node newNode) {//还是先判断链表是否为空,判断头部节点的下一位是否为空if (headNode.next == null) {System.out.println("链表为空~~~");return;}//找到需要修改的节点,根据num号//定义一个辅助节点,这次就不是头结点了,因为头结点不能更改Node temp = headNode.next;//立一个flag,表示是否找到这个节点boolean flag = false;while (true) {if (temp == null) {break;//说明已经遍历完了}if (temp.num == newNode.num) {//说明找到flag = true;break;}//每次循环指针指向下一个temp = temp.next;}//根据flag来判断是否找到要修改的节点if (flag) {//说明找到,就将新节数据赋值给遍历到的这个节点temp.name = newNode.name;} else {//没有找到System.out.println("没有找到编号为:" + newNode.num + "的节点~~~");}}/*删除节点思路:由于是双链表结构,我们temp辅助指针指向后可以进行自我删除*/public void delNode(int num) {//判断链表是否为空if (headNode.next == null) {System.out.println("链表为空~~~");return;}//同样,标志是否摘掉带删除的节点Node temp = headNode.next;//立flagboolean flag = false;while (true) {if (temp == null) {//已经到达最后的节点break;}//因为现在temp指向谁,谁就是可以自我删除if (temp.num == num) {//说明找到了删除节点的前一个节点tempflag = true;break;}temp = temp.next;//循环后移}//判断flagif (flag) {//说明找到,可以删除temp.pre.next = temp.next;//先将temp前面的next指向temp.next,这样temp就断了一条//因为我们可能要删除的是最后一条,最后一条的temp.next为空//那么temp.next== null.pre就 一定会空指针异常if (temp.next != null) {temp.next.pre = temp.pre;//在将temp的后一个的pre指向temp的pre.这样又断了一条,就实现了自我删除}} else {System.out.println("您需要删除的节点:" + num + "在链表中不存在~~~");}}/*显示链表,遍历查看*/public void showLinkedList() {//判断链表否为空,if (headNode.next == null) {System.out.println("链表为空,请添加后查看~~~");return;}//同样,头结点不能动,作为辅助遍历,从头节点的下一位开始显示,头节点不显示Node temp = headNode.next;while (true) {//判断是否到最后一个节点了if (temp == null) {break;}//输出节点信息System.out.println(temp);//将temp后移temp = temp.next;}}}//创建一个类类模拟双链表节点
class Node {public int num;//当前节点数public String name;//给当前节点取个名字,模拟节点存储的数据public Node next;//当前节点存储的下一个节点信息public Node pre;//存储当前节点的前一个节点//提供构造方法来初始化这个节点信息public Node(int num, String name) {this.num = num;this.name = name;}@Overridepublic String toString() {return "Node{" +"num=" + num +", name='" + name + '\'' +'}';}
}
测试控制台结果
---------添加4个节点(1,2,3,4)------------
----------------测试遍历双向链表---------------
Node{num=1, name='节点一'}
Node{num=2, name='节点二'}
Node{num=3, name='节点三'}
Node{num=4, name='节点四'}
---------------测试添加节点到双链表的最后----------------------
Node{num=1, name='节点一'}
Node{num=2, name='节点二'}
Node{num=3, name='节点三'}
Node{num=4, name='节点四'}
Node{num=5, name='节点五'}
----------删除节点为3的---------------
Node{num=1, name='节点一'}
Node{num=2, name='节点二'}
Node{num=4, name='节点四'}
Node{num=5, name='节点五'}
-----------修改节点5的数据为测试节点----------
Node{num=1, name='节点一'}
Node{num=2, name='节点二'}
Node{num=4, name='节点四'}
Node{num=5, name='测试节点'}
浅谈:数据结构之双链表结构与代码模拟双链表的实现相关推荐
- 浅谈:数据结构之单链表,java代码演示单链表
单链表 本文是观看尚硅谷韩老师视频学习总结,部分来源网络. 单链表介绍 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每 ...
- 浅谈数据结构和数据类型
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012540337/article/details/80499226 最近总是被这两个概念混淆,抽出 ...
- 【浅谈数据结构】《数据结构》Data Structure
<数据结构>60' 一.栈(stack).队列(Queue).向量(Vector) 1.链表 带哨兵节点链表了解清楚 链表要会写,会分析.各种链表. 2.栈 LIFO(last in fi ...
- java 算法_Java 浅谈数据结构和算法
以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题: "介绍下java中的数据结构和算法". 很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程 ...
- 汇智动力学院——Java 浅谈数据结构和算法
以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题: "介绍下java中的数据结构和算法", 很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程 ...
- 浅谈网络爬虫中广度优先算法和代码实现
前几天给大家分享了网络爬虫中深度优先算法的介绍及其代码实现过程,没来得及上车的小伙伴们可以戳这篇文章--浅谈网络爬虫中深度优先算法和简单代码实现.今天小编给大家分享网络爬虫中广度优先算法的介绍及其代码 ...
- C++ 静态链表(用数组模拟动态链表)
描述 主题:链表 功能:用数组模拟动态链表,分别实链表的插入.删除操作 提示:如果需要进入下一步操作,输入错误范围(如:0)即可 第一个元素的cur用于存放备用链表的第一个元素的下标 最后一个元素的c ...
- 浅谈数据结构-平衡二叉树
平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树.1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵 ...
- 浅谈数据结构-二叉排序树
构造二叉排序树目的是为了提高查找.插入和删除的效率.其实在构建二叉排序树的时候已经暗藏着排序.因此二叉排序树具有以下几个特点: 如根节点有左子树,则左子树的所有结点都比根节点小. 如根节点有右子树,则 ...
最新文章
- rocketmq 消息 自定义_rocketMq-Topic创建过程
- python的代码有哪些_Python有哪些有趣的代码呢,这些代码让
- 网络——Base64Encode(转:自定义Base64编码器——Base64Encode)
- okex java sdk_OKEX官网新手使用教程
- 【LeetCode笔记】剑指 Offer 44. 数字序列中某一位的数字(Java、偏数学)
- Linux C++ glog日志库的简单使用
- 计算机学院的logo设计原理,logo
- 第一部分 web前端课程
- sketchup 图片转模型_3d模型转su模型(如何将3D模型转化为sketchup)
- 单片机流水单C语言程序,51单片机流水灯C语言源程序
- DEP(Data Execution Prevention) 数据执行保护
- CodeForces 711B. Chris and Magic Square(水题)
- 2022全国大学生数学建模竞赛
- 手机、手环NFC刷门禁卡
- 自己的PHP实践项目:开源电子商城系统
- Python数据分析基础之Excel文件(6)
- 诸多检测、实验让你自己判断转基因大豆油是否安全无害!
- Nginx——缓存配置
- 【毕业设计】深度学习+python+opencv实现动物识别 - 图像识别
- “笨办法”学Python3,Zed A. Shaw,习题18