大话数据结构:线性表的循环链式存储结构

Posted by Viletyy on 2020-06-11 10:01

循环链表

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

其实循环链表和单链表的主要差异就在于循环的判断条件上,原来是判断p->next是否空,现在则是p->next不等于头结点,则循环未结束。

在单链表中,我们有了头结点时,我们可以用O(1)的时间访问第一个结点,但对于要访问到最后一个结点,却需要O(n)时间,因为我们需要将单链表全部扫描一遍。

在循环链表中,不用头指针,二十用指向终端结点的尾指针来表示循环链表,此时查找开始结点和终端结点都很方便了。

终端结点用尾指针rear指示,则查找终端结点是O(1),而开始结点,其实就是rear->next->next,其时间复杂也为O(1)

合并两个循环链表

1
2
3
4
p = rearA->next; /*保存A链表的头结点*/
rearA->next=rearB->next->next; /*将本是指向B链表的第一个结点赋值给rearA->next*/
rearB->next=p /*将原A链表的头结点赋值给rearB->next*/
free(p); /*释放p*/

参考资料: