线性表的链式存储(双向循环链表)


前言

  T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结构 C语言版 第2版》严蔚敏。
  有关线性表的顺序存储见线性表概念及顺序表的实现
  有关单链表见线性表的链式存储(单链表)
  有关单循环链表见线性表的链式存储(单循环链表)
  有关双向链表见线性表的链式存储(双向链表)


一、双向循环链表是什么?

  首先对双向链表和循环链表进行解释。
  双向链表:在链表的结点中有两个指针域,一个指向直接后继,另一个指向直接前驱。如下图所示(图源亿速云)。对于头结点,无直接前驱结点,故prev为NULL;对于最后一个结点,无直接后继结点,故next为NULL。

  循环链表(CircularLinked List)是除单链表之外另一种形式的链式存储结构。其特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。(贪吃蛇尾巴咬了头)循环链表从表中任一结点出发均可找到表中其他结点,下图所示为单链的循环链表。类似地,还可以有多重链的循环链表。
在这里插入图片描述
  由此可知,双向循环链表就是双向链表成环(天才!)。
在这里插入图片描述

二、双向循环链表的意义

  双向链表便于求某个已知结点的直接前驱,循环链表(尾指针形式)便于求最后一个结点。双向循环链表可以看作两者优势的综合。

链表类型查找表头结点(首元结点)查找表尾结点查找结点*p的前驱结点
带头结点的单链表LL->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)
带头结点的双向循环链表LL->next,时间复杂度O(1)L->prior,时间复杂度为O(1)p->prior时间复杂度为O(1)

三、双向循环链表的操作实现

  由前面分析可知,双向循环链表的操作应该是双向链表操作和循环链表操作的有机结合。
  有关单循环链表操作见线性表的链式存储(单循环链表)
  有关双向链表操作见线性表的链式存储(双向链表)
  下面给出双向循环链表的操作实现:

不是哥们,单循环链表操作和双向链表操作都给你了,还不自己动手写写?

总结

  路漫漫其修远兮,吾将上下而摆烂。
  有任何疑问和补充,欢迎交流。(但我显然不会)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值