对于单链表,由于每个结点只存储了向后的指针,到了尾标志就停止了向后链的操作,这样,当中某一结点就无法找到它的前驱结点了。
将单链表中终端结点的指针端由空指针改为指向头结点,这就使整个单链表形成一个环,这种头尾相接的单链表,称为单循环链表,简称“循环链表”。
为了使空链表与非空链表处理一致,我们通常设有一个头结点,当然,这并不是说,循环链表一定要有头结点。
循环链表带有头结点的空链表,如图:
非空的循环链表,如图:
改造一下上面那个循环链表,不用头指针,而是改用指向终端结点的尾指针来表示循环链表,此时,查找开始结点和终端结点都很方便了。
例:
将两个循环链表合并成一个表时,有了尾指针,就非常简单了。比如,下面的这两个循环链表,它们的尾指针分别是 rearA 和 rearB ,如图:
要想把它们合并,只要如下的操作即可:
//保存A的头结点;
p = rearA->next ;
//将本是指向B表的第一个结点(不是头结点)赋值给 rearA->next
rearA->next = rearB->next->next ;
//将原A表的头结点赋值给rearB->next
rearB->next = p;
//释放p
free( p ) ;