【线性表】链式存储结构之:循环链表

循环链表(Circular Linked List)是一种首尾相接的单链表。


循环链表

(1)单循环链表 ——在单链表中,将终端结点的指针域NULL改为指向表头结点或开始结点即可。

(2)多重链的循环链表
——将表中结点链在多个环上。

  单循环链表示意图:
注意:
        循环链表的操作和线性表基本一致,只是 判断空链表的条件是head==head->next;



仅设尾指针的单循环链表

用尾指针rear表示的单循环链表对 开始结点a1 终端结点an 查找时间都是O(1)。
而表的操作常常是在表的首尾位置上进行,因此,实用中多采用尾指针表示单循环链表。
带尾指针的单循环链表可见下图:


注意:
     判断空链表的条件为rear==rear->next;



循环链表的特点

循环链表的特点是无须增加存储量,仅对表的链接方式稍作改变,即可使得表处理更加方便灵活。
【例】在链表上实现将两个线性表(a 1 ,a 2 ,…,a n )和(b 1 ,b 2 ,…,b m )连接成一个线性表(a 1 ,…,a n ,b 1 ,…b m )的运算。

分析: 若在单链表或头指针表示的单循环表上做这种链接操作,都需要遍历第一个链表,找到结点a n ,然后将结点b 1 链到a n 的后面,其执行时间是O(n)。若在尾指针表示的单循环链表上实现,则只需修改指针,无须遍历,其执行时间是O(1)。

两个单循环链表的链接操作示意图
 

相应的算法如下:

LinkList Connect( LinkList A,  LinkList B )
{//假设A,B为非空循环链表的尾指针
    LinkList p = A->next;             //保存A表的头结点位置
    A->next = B->next->next;    //B表的开始结点链接到A表尾
    free(B->next);                        //释放B表的头结点
    B->next=p;                            //将B表的尾链接到A表的头结点
    return B;                                //返回新循环链表的尾指针
} 

注意:

  • 循环链表中没有NULL指针。涉及遍历操作时,其终止条件就不再是像非循环链表那样判别p或p->next是否为空,而是判别它们是否等于某一指定指针,如头指针或尾指针等。
  • 在单链表中,从一已知结点出发,只能访问到该结点及其后续结点,无法找到该结点之前的其它结点。而在单循环链表中,从任一结点出发都可访问到表中所有结点,这一优点使某些运算在单循环链表上易于实现。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值