【数据结构与算法】双向链表

简介: 【数据结构与算法】双向链表

一.双向链表的原理

双向链表顾名思义,就是两个方向都可以,像我们的单链表,只能从前往后,而不能从后往前.

这样在我们插入和删除数据的时候,我们就不用去找到要操作节点的上一个节点,只需要找到要操作的节点,直接往前访问就可以了.

二.双向链表的结构

很明显我们需要知道前一个位置是什么,所以我们需要两个指针域.

一个指向上一个节点的指针域,一个指向下一个节点的指针域.

三.双向链表的初始化

画个图你们就知道怎么初始化了:

两个指针都设置为空.

四.双向链表增加元素

1.前插法

跟单链表差不多,但是我们需要增加一个对上一个指针的操作

如果是只有一个头节点,然后插入节点时,新节点的下一个指针就是头节点的下一个指针,也可以是空因为头节点的下一个位置就是空.

然后新节点的上一个位置就是头节点,头节点的下一个位置就是新节点.

如果有其他的节点,那么多了一步就是新插入节点的下一个位置的上一个位置是新节点,也就是L->next->prev = node;

2.尾插法

当然还是需要我们进行遍历到尾节点,跟单链表差不多.

只需要将新插入的节点的下一个位置设为空,上一个位置是刚刚的遍历到的尾节点,然后刚刚的尾结点的下一个位置就是新插入的节点.

3.任意位置插入

任意位置插入,现在我们就不需要再去找前一个节点了,直接找到我们要插入的位置通过前一个指针,就可以找到前一个节点了,然后进行插入操作.

插入操作的解释如下(注意顺序):

要插入节点的上一个位置的下一个位置为新插入的节点

新插入节点的下一个位置是找到插入位置的节点.

新插入节点的上一个位置是插入位置节点的上一个节点

插入位置的节点的上一个节点是新插入的节点.

五.双向链表的遍历

其实是跟单链表是一样的,不过我们居然可以指向前一个位置,那么我们还可以逆向打印.

两个遍历的条件都是p的指针域而不是p本身.

正向打印的时候,需要打印尾结点所以是p->next->data

逆向打印的时候,不需要打印头节点,所以是p->data

六.双向链表删除元素

跟插入一样,现在就不需要遍历找到要删除的前一个节点的位置,只需要找到要删除的位置即可.

所以删除的操作有两种情况,如果要删除位置的下一个为空就是第二种情况,只需要p->prev->next=p->next

如果不是最后一个节点的话,还需要p->next->prev=p->prev

像双向链表的销毁和获取元素等都和单链表一样就不展开了.

七.总结

双向链表比单链表多了一个指向前一个位置的指针,方便了我们进行查找,对插入和删除的时候,我们可以将目标放在我们想要的上面.

需要注意插入和删除的操作,多了一个前面指针的赋值.

相关文章
|
9天前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
1月前
|
存储 Java 索引
【数据结构】链表从实现到应用,保姆级攻略
本文详细介绍了链表这一重要数据结构。链表与数组不同,其元素在内存中非连续分布,通过指针连接。Java中链表常用于需动态添加或删除元素的场景。文章首先解释了单向链表的基本概念,包括节点定义及各种操作如插入、删除等的实现方法。随后介绍了双向链表,说明了其拥有前后两个指针的特点,并展示了相关操作的代码实现。最后,对比了ArrayList与LinkedList的不同之处,包括它们底层实现、时间复杂度以及适用场景等方面。
44 10
【数据结构】链表从实现到应用,保姆级攻略
|
2月前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
2月前
|
存储 测试技术
【初阶数据结构篇】双向链表的实现(赋源码)
因为头结点的存在,plist指针始终指向头结点,不会改变。
|
2月前
|
存储 测试技术
【初阶数据结构篇】单链表的实现(附源码)
在尾插/尾删中,都需要依据链表是否为空/链表是否多于一个节点来分情况讨论,目的是避免对空指针进行解引用造成的错误。
|
2月前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
14 0
|
2月前
|
算法
【数据结构与算法】循环链表
【数据结构与算法】循环链表
15 0
|
3天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
1月前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
1月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
下一篇
无影云桌面