前言
T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结构 C语言版 第2版》严蔚敏。
有关线性表的顺序存储见线性表概念及顺序表的实现;
有关单链表见线性表的链式存储(单链表);
有关单循环链表见线性表的链式存储(单循环链表);
有关双向链表见线性表的链式存储(双向链表)。
一、双向循环链表是什么?
首先对双向链表和循环链表进行解释。
双向链表:在链表的结点中有两个指针域,一个指向直接后继,另一个指向直接前驱。如下图所示(图源亿速云)。对于头结点,无直接前驱结点,故prev为NULL;对于最后一个结点,无直接后继结点,故next为NULL。
循环链表(CircularLinked List)是除单链表之外另一种形式的链式存储结构。其特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。(贪吃蛇尾巴咬了头)循环链表从表中任一结点出发均可找到表中其他结点,下图所示为单链的循环链表。类似地,还可以有多重链的循环链表。
由此可知,双向循环链表就是双向链表成环(天才!)。
二、双向循环链表的意义
双向链表便于求某个已知结点的直接前驱,循环链表(尾指针形式)便于求最后一个结点。双向循环链表可以看作两者优势的综合。
链表类型 | 查找表头结点(首元结点) | 查找表尾结点 | 查找结点*p的前驱结点 |
---|---|---|---|
带头结点的单链表L | L->next,时间复杂度O(1) | 从L->next依次向后遍历时间复杂度为O(n) | 通过*p无法找到其前驱 |
仅设头指针L的循环单链表 | L->next,时间复杂度O(1) | 从L->next依次向后遍历时间复杂度为O(n) | 通过p->next可以找到其前驱,时间复杂度为O(n) |
仅设尾指针R的循环单链表 | R->next,时间复杂度O(1) | R,时间复杂度O(1) | 通过p->next可以找到其前驱,时间复杂度为O(n) |
带头结点的双向循环链表L | L->next,时间复杂度O(1) | L->prior,时间复杂度为O(1) | p->prior时间复杂度为O(1) |
三、双向循环链表的操作实现
由前面分析可知,双向循环链表的操作应该是双向链表操作和循环链表操作的有机结合。
有关单循环链表操作见线性表的链式存储(单循环链表);
有关双向链表操作见线性表的链式存储(双向链表)。
下面给出双向循环链表的操作实现:
不是哥们,单循环链表操作和双向链表操作都给你了,还不自己动手写写?
总结
路漫漫其修远兮,吾将上下而摆烂。
有任何疑问和补充,欢迎交流。(但我显然不会)