1.介绍
在计算机科学中,一个链接名单是一个线性数据结构,其中每个元素中的指针确定顺序。
在本教程中,我们将展示如何检查链接列表是否是循环链接列表。
2。循环链接名单
链接列表的每个元素都包含一个数据字段,用于存储列表数据和指针字段以指向序列中的下一个元素。我们可以使用一个指向指向链接列表的起始元素的指针:

在常规链接列表中,最后一个元素没有下一个元素。因此,它是指针字段是
。但是,在一个循环链接名单,最后一个元素对列表中的一个元素引用了:

3.哈希表解决方案
很容易看出,如果链接列表包含一个循环,我们最终会在遍历链接列表时两次访问同一节点。因此,我们可以使用一个哈希表要解决这个问题:
该算法遍历链接列表,并在哈希表中记录每个节点的引用。我们使用链接列表节点的引用作为其唯一标识符。如果我们在哈希表中看到相同的参考,我们可以返回表示循环链接列表。否则,我们终于到达了
节点并返回
。
让我们假设每个哈希表操作,例如插入和搜索,需要时间。然后,该算法的总体时间复杂性是
当我们遍历整个链接的列表一次。空间复杂性也是如此
,我们需要将所有节点存储到哈希表中。
4.解决方案与两个指针
要检测链接列表是否是循环链接列表,我们可以使用具有不同速度的两个指针:a指针和A.
指针。我们使用这两个指针遍历链接列表。这
指针一次移动一步,而且
指针移动两个步骤。
如果列表中没有周期,则指针最终将达到最后一个元素
指针是
并停在那里。
对于一个循环的链接列表,让我们想象一下和
指针是两个跑步围绕圆形轨道的跑步者。在开始时,
赛跑者通过了
赛跑者。但是,它最终会满足
跑步者再次落后。我们可以使用相同的想法来检测链接列表中是否存在周期:
在该算法中,我们首先对输入进行了理智检查指针。然后,我们开始两个指针,
和
,在不同的地方。在循环中,我们以不同的速度推进两个指针。如果是
指针到达终止
指针,我们可以得出结论,链接列表没有循环。否则,两个指针最终会满足。然后,我们完成循环并返回
表示循环链接列表。
5.两点溶液的复杂性分析
如果链接列表没有循环,则循环将完成指针到达结束。因此,时间复杂性是
在这种情况下。
对于循环链接的列表,我们需要计算制作的步数指针抓住
指针。让我们首先分解它的运动
指向两个阶段。
在第一阶段,指针需要
进入循环的步骤。此时,
指针已经在循环中并且是
元素分开
指针链接列表方向。在以下示例中,两个指针之间的距离是3个元素,因为我们需要推进
指针3元素捕获
指向周期中的指针:

在第二阶段,两个指针都在循环中。这指针在每个迭代中移动2个步骤,以及
指针移动1步。因此,这是
指针可以在每次迭代中捕获1个元素。由于开始时这两个指针之间的距离是
, 我们需要
迭代使这两个指针相遇。
因此,总运行时间是, 在哪里
是之间的元素数量
和循环的起始元素,和
是两个指针之间的距离
指针到达循环。自从
在最多的循环长度,整个时间复杂性也是
。
空间复杂性是因为我们只使用两个指针(
和
)在算法中。
六,结论
在本教程中,我们显示了一个示例循环链接列表。此外,我们讨论了两个可以检查链接列表是否是循环链接列表的两个线性时间算法。