【数据结构】循环链表和双向链表

文章目录

前言

对于单链表,由于每个结点只存储了向后的指针,到了为标志就停止了向后链的操作。这样,当我们需要找到某个结点的前驱就没办法了。如何从链表中的任一结点出发,访问到链表的全部结点?循环链表就是解决这个麻烦的重要方法。


一、循环链表的定义

1、定义

将单链表中终端结点的指针端由空指针改为指向头指针,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。

为了使空链表与非空链表处理一致,通常可以设一个头结点,当然不是所有的循环链表一定要头结点。

2.特点:

循环链表和单链表的主要差异在于循环的判断条件上,单链表是判断p->next是否为空,而循环链表是p->next是否等于头结点。 


二、循环链表的改进

在单链表中,有头结点时,访问第一个结点的时间是O(1),但要访问最后一个元素时,需要O(n)时间。

如何改进能使由链表指针访问到最后一个结点用O(1)时间呢?

方法:对于上述的循环链表进行改进,不用头指针,而使用指向终端结点的尾指针来表示循环链表。

 上图循环链表,查找终端结点为O(1),而开始结点为rear->next->next,时间复杂度也是O(1)。

应用:将两个循环链表合并成一个表。


三、双向链表的定义

循环链表为遍历及查找尾结点带来了遍历,但是查找某个结点的直接前驱,与单链表一样,都要从头结点(或尾结点)开始,遍历整个链表,时间复杂度为O(n)。双向链表解决了这个问题,但需要付出一定的空间代价。

双向链表是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。所以双向链表结点都有两个指针域,一个指向直接前驱,一个指向直接后继。

双向链表存储结构设计:

typedef struct DulNode
{
    ElemType data;
    struct DulNode *prior;/*直接前驱指针*/
    struct DulNode *next;/*直接后继指针*/
}DulNode,*DulLinkList;

四、双向循环链表

既然单链表有循环结构-单向循环链表,那么双向链表也可以循环——双向循环链表。

带头结点的双向循环链表的空链表:

非空的带头结点的双向循环链表:

对于双向链表,链中的某一个结点p,它的前驱的后继,后继的前驱都是自己,

即:p->prior->next=p=p->next->prior


五、双向链表的插入和删除操作

1.插入操作

2.删除操作

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值