==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍
**基本思想:**在单链表的基础上,让最后一个节点指向头节点,还可以添加一个尾指针,指向最后一个节点,方便合并两个链表。
**优点:**可以在任意地方遍历到指定的节点。
**缺点:**和单链表的缺点一样。
C代码实现下载
C++代码实现下载
java代码实现下载
(备用下载地址)
如果不加入尾指针,那循环链表的所有操作都和单链表一样一样的,只要把最后一个节点指向头节点即可。
如图:
加上尾指针后,难点在于,如何保持尾指针一定指向最后一个节点。解决办法就是,头添加的时候,判断一下链表是否为空,如果为空,则让尾指针指向第一个节点,以后当新的节点以头添加方式添加进来的时候,都不会改变尾指针的指向。若是尾添加方式,则第一次添加的时候调用头添加函数即可,接下来,直接挂在最后一个节点处,修改尾指针指向。(因为尾指针指向最后一个节点,所以相当于,不用遍历,即可获取得到最后一个节点)
如图:
头添加
尾添加
关于两个表的合并,其实很简单,修改一下尾指针的指向即可,就是让表1的最后一个节点指向表2的第一个节点,表2的最后一个节点指向表1的头节点。但是这样做,效率是上来了,时间复杂度只有0(1),但是这样合并后,表2会受表1的影响,因为它们拥有一块共同的地址空间。如果想合并后,两个表完全无影响,那就只有先把表2复制一份,然后再合并。这样,时间复杂度就变为0(n)了,主要看的是表2的大小。
如图:
最后就是遍历的时候,停止条件的问题,不再是最后一个节点指向NULL了,而是指向head。