
上次介绍了不带头单向不循环链表,接下来我们一起看看双向带头循环链表。
双向带头循环链表是一种特殊的双向链表,具有以下特点:
- 双向链表: 每个节点有两个指针,一个指向前驱节点(),一个指向后继节点()。因此,从任意节点可以沿链表向前或向后遍历。
- 带头节点: 链表中有一个特殊的头节点(通常不存储实际数据,称为哨兵节点)。头节点的主要作用是简化操作,如插入和删除。它提供统一的起始点,使得链表的头尾操作更加方便。
- 循环链表: 链表的最后一个节点的 指向头节点,头节点的 指向最后一个节点。因此,链表是循环的,没有明确的开始和结束,方便从任意节点进行循环遍历。
- 头节点作为链表的起始和终止标记,解决了普通链表操作时需要判断空链表或链表尾部的问题。
- 空链表时,头节点的 和 都指向自己。
- 统一操作: 无论链表是否为空,头节点总是存在,插入和删除操作不需要特殊处理空链表或只有一个节点的情况。
- 双向遍历: 可以从任意节点向前或向后遍历,非常灵活。
- 循环结构: 链表没有明确的尾部,方便处理循环场景。
双向带头循环链表常用于需要频繁插入和删除操作的场景,能够高效地处理这些操作。

双向链表有三个数据,保存它自身数据,他的前驱指针,以及他的后继指针。

因为初始化要创造头节点,而且为了方便后续插入操作创造节点,我们要先写出创造节点的方法
创造出的节点本身自己也必须是双向循环的才可以,他的prev以及next都指向他自己,自身成环。
销毁的时候要遍历链表,将链表中的每一个节点都销毁,这里我们传的是二级指针,头节点会被会被销毁,但后面为了统一接口需要手动释放。
和单链表一样,打印链表就是遍历链表.
注意,当时我们的循环条件是pcur != NULL,但是双链表是循环的,还这样写的话就成了死循环,因此需要让循环条件变成 pcur != phead
我们来看下面这张图,看一下尾插涉及到了哪些节点。

我们来看下面这张图,看一下头插涉及到了哪些节点。

删除操作要判断当前链表是不是空链表,如果为空就不进行删除。
为空就是链表只有头节点。
我们来看这张图。


查找遍历链表,返回结点。


因为有哨兵位的存在,我们不用改变头结点,因此就可以传一级指针
将接口改为一级指针,因为形参无法影响实参,因此需要手动接收所创造出来的结点。
这样来接收~
将接口改为一级指针,因为形参无法影响实参,因此创造的plist需要手动释放,将plist放置为NULL。
像这样置空~
到这里相信大家对双向链表有一个深入的了解了,最后的总结双向链表实现的源码奉上需要的小伙伴们自取哦~
真相永远只有一个!

版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/12389.html
