《数据结构之美--双向链表》

引言

之前我们学习了单链表 这一数据结构,虽然单链表 的功能比较多,但是也存在着一些局限性,因为在单链表 中节点的指向都是单向的,因此我们想从某个节点找到它的上一个节点比较困难,来不及再迷恋单链表 了,接下来登场的是更加方便的双向链表

双向链表

旧知引入 :

双向链表跟我们前面学习的单链表 相比,只是多了一个指针域,因此大家完全可以拿着之前学习单链表 的逻辑来带入双向链表的学习。

双向链表的形式:

代码实现:

双向链表各项功能的实现

一:申请节点

由于我们实现的双向链表 要有一个哨兵位 ,并且之后的插入数据也需要申请节点 ,因此这里先实现申请节点的函数。

二:初始化

1. 声明 :

注意这里的初始化可以写成传参 或者不传参两种形式,这里我们可以两个都实现一下。

2. 逻辑实现:
实现方式1 -- 传参数 :

注意这里由于需要改变传入的一级指针的指向,因此这里的函数参数是二级指针来接收一级指针的地址。

实现方式2 -- 不传参数
3. 测试:

可以看到初始化函数没有问题。

三:打印

1. 逻辑分析:

既然要打印链表 就不可避免的要遍历链表 ,之前我们的单链表 是根据最后一个节点的next指针为空的性质来进行遍历的,但由于双向链表 最后一个节点的next指针并不为空,因此就需要根据双向链表 的性质来写,由于我们实现的双向链表 存在一个哨兵位 ,因为哨兵位 只是占位置,并不存储有效数据,因此我们可以定义一个指针从第一个节点开始,只要没有走到哨兵位就一直遍历。

2. 声明:
3. 代码实现:


注:打印函数的正确性放到后面检验。

四:查找

1.逻辑分析:

既然要查找,就不可避免地要遍历链表 ,因此这里的实现方式和打印函数 基本上一样,并且这里的返回值 是节点的地址

2. 声明:
3.代码实现:


注:查找函数的正确性也是放到后面检验。

五: 尾插

1. 逻辑分析:
2.声明:
3. 代码实现:
4. 测试:

这里我们每调用一次尾插函数 就打印一次链表,可以看到没有问题。

六:头插

1. 逻辑分析:

注:这里提前说明我们的头插是在第一个节点的前面,因为哨兵位并不是有效节点

2. 声明:
3. 代码实现:
4.测试:

通过测试可以看到不存在问题。

七:在POS位置之后插入数据

1. 逻辑分析:
2. 声明:

由于是在POS位置之后插入数据,不需要知道哨兵位 的位置也能做到,所以这里需要传入POS位置的地址。

3. 代码实现:
4. 测试:

这里我们通过查找函数来找到对应节点的地址,然后每插入一次就打印一次。

八:删除POS位置的节点

1. 逻辑分析:
2. 声明:
3. 代码实现:
4. 测试:

九:头删

1. 逻辑分析:

注:既然要执行删除操作,那么你的链表里得有节点才行啊,因此这里还需要先判空

判空


2. 声明:
3. 代码实现:
4. 测试:

十:尾删函数

1. 逻辑分析:
2. 声明:
3.代码实现:
4. 测试:

十一:销毁

1. 逻辑分析:

所谓的销毁函数 ,其实就是把我们向内存 申请的空间都归还回去,这样的话还是要遍历链表 ,和单链表销毁函数逻辑没什么区别。

2. 声明:
3. 代码实现:


注:这里我们传入的是一级指针,并不会改变哨兵位,因此哨兵位要手动释放。

4. 测试:


可以看到将哨兵位在内的节点都释放掉了。

总结:

通过上述介绍,想必同学们已经对双向链表 有了一个较为清晰的认识,和单链表 相比,双向链表 在各种操作上确实比单链表 要优秀不少,但也不代表单链表就一无是处,所有的数据结构都是存在即合理,所以我们都要掌握。

那么下次我们来学习另外一个数据结构--

相关推荐
一只鱼^_3 分钟前
牛客周赛 Round 105
数据结构·c++·算法·均值算法·逻辑回归·动态规划·启发式算法
指针满天飞2 小时前
Collections.synchronizedList是如何将List变为线程安全的
java·数据结构·list
洋曼巴-young2 小时前
240. 搜索二维矩阵 II
数据结构·算法·矩阵
楼田莉子3 小时前
C++算法题目分享:二叉搜索树相关的习题
数据结构·c++·学习·算法·leetcode·面试
小明的小名叫小明4 小时前
区块链技术原理(14)-以太坊数据结构
数据结构·区块链
pusue_the_sun4 小时前
数据结构——栈和队列oj练习
c语言·数据结构·算法··队列
奶黄小甜包5 小时前
C语言零基础第18讲:自定义类型—结构体
c语言·数据结构·笔记·学习
想不明白的过度思考者5 小时前
数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
数据结构·算法·排序算法
一支闲人5 小时前
C语言相关简单数据结构:双向链表
c语言·数据结构·链表·基础知识·适用于新手小白
姜不吃葱5 小时前
【力扣热题100】双指针—— 接雨水
数据结构·算法·leetcode·力扣热题100