1
算法与数据结构  C语言版
1.4.3.3 2.3.3 循环链表
2.3.3 循环链表

循环链表(circular linked list)是另一种形式的链式存储结构。它的特点是链表中最后一个结点的指针域指向头结点,整个链表形成一个环。由此从表中任一结点出发均可找到表中其他结点,单链表中,每个结点的指针都指向其下一个结点,最后一个结点的指针域为空(NULL),因为它没有后继。若把这种结构稍加修改,使最后—个结点的指针返回指向头结点,则整个链表形成一个环,称为循环链表。图2-17所示为非空循环链表和空循环链表的一般形式。

图2-17 循环链表的一般形式

采用循环链表结构给结点的访问带来了方便。此时,只要给定表中任意一个结点的地址,通过它就可以访问到表中所有的结点,而普通链表只有从表头开始访问,才能访问到表中的所有结点。循环链表的这一特性称为可及性。可及性是循环链表的重要特性。

在循环链表上执行插入、删除等操作类似于普通链表的插入、删除等操作,也只修改相应的指针。其差别在于算法中循环的条件不再是p或p-next是否为空,而是它们是否等于头指针。

采用循环链表结构还可以使某些运算简化。例如,若在循环链表中设一尾指针而不设头指针(如图2-18(a)所示),则在将两个链表合并成一个链表的时候,只要将一个链表的尾和另一个链表的头相接,因而非常方便。其整个过程只修改两个指针,时间复杂度为O(1),合并后的表如图2-18(b)所示。合并步骤如下:

图2-18 仅设置指针的循环链表