循环链表即是一种首尾相接的链表
(1)带头结点的单循环链表示意图:
注:判断空链表的条件是:head = head->next
(2)仅设置尾指指针的但循环链表
注:判断空链表的条件是:rear = rear->next
俩个单链表合并成一个循环链表:
在链表上实现将两个线性表(a1,a2,…,an)和(b1,b2,…,bm)连接成一个线性表(a1,…,an,b1,…bm)
分析:若在单链表或头指针表示的单循环表上做这种链接操作,都需要遍历第一个链表,找到结点an,然后将结点b1链到an的后面,其执行时间是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->next = p; //完成循环连接
return B;
}
注意:
①循环链表中没有NULL指针。涉及遍历操作时,其终止条件就不再是像非循环链表那样判别p或p->next是否为空,而是判别它们是否等于某一指定指针,如头指针或尾指针等。
②在单链表中,从一已知结点出发,只能访问到该结点及其后续结点,无法找到该结点之前的其它结点。而在单循环链表中,从任一结点出发都可访问到表中所有结点,这一优点使某些运算在单循环链表上易于实现。