1.介绍

在计算机科学中,一个链接名单是一个线性数据结构,其中每个元素中的指针确定顺序。

在本教程中,我们将展示如何检查链接列表是否是循环链接列表。

2。循环链接名单

链接列表的每个元素都包含一个数据字段,用于存储列表数据和指针字段以指向序列中的下一个元素。我们可以使用一个头指向指向链接列表的起始元素的指针:

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

3.哈希表解决方案

很容易看出,如果链接列表包含一个循环,我们最终会在遍历链接列表时两次访问同一节点。因此,我们可以使用一个哈希表要解决这个问题:

QuickLatex.com呈现

该算法遍历链接列表,并在哈希表中记录每个节点的引用。我们使用链接列表节点的引用作为其唯一标识符。如果我们在哈希表中看到相同的参考,我们可以返回真的表示循环链接列表。否则,我们终于到达了空值节点并返回错误的

让我们假设每个哈希表操作,例如插入和搜索,需要O(1)时间。然后,该算法的总体时间复杂性是上)当我们遍历整个链接的列表一次。空间复杂性也是如此上),我们需要将所有节点存储到哈希表中。

4.解决方案与两个指针

要检测链接列表是否是循环链接列表,我们可以使用具有不同速度的两个指针:a慢的指针和A.快速地指针。我们使用这两个指针遍历链接列表。这慢的指针一次移动一步,而且快速地指针移动两个步骤。

如果列表中没有周期,则快速地指针最终将达到最后一个元素下一个指针是空值并停在那里。

对于一个循环的链接列表,让我们想象一下慢的快速地指针是两个跑步围绕圆形轨道的跑步者。在开始时,快速地赛跑者通过了慢的赛跑者。但是,它最终会满足慢的跑步者再次落后。我们可以使用相同的想法来检测链接列表中是否存在周期:

QuickLatex.com呈现

在该算法中,我们首先对输入进行了理智检查头指针。然后,我们开始两个指针,慢的快速地,在不同的地方。在循环中,我们以不同的速度推进两个指针。如果是快速地指针到达终止空值指针,我们可以得出结论,链接列表没有循环。否则,两个指针最终会满足。然后,我们完成循环并返回真的表示循环链接列表。

5.两点溶液的复杂性分析

如果链接列表没有循环,则循环将完成快速地指针到达结束。因此,时间复杂性是上)在这种情况下。

对于循环链接的列表,我们需要计算制作的步数快速地指针抓住慢的指针。让我们首先分解它的运动慢的指向两个阶段。

在第一阶段,慢的指针需要K.进入循环的步骤。此时,快速地指针已经在循环中并且是D.元素分开慢的指针链接列表方向。在以下示例中,两个指针之间的距离是3个元素,因为我们需要推进快速地指针3元素捕获慢的指向周期中的指针:

在第二阶段,两个指针都在循环中。这快速地指针在每个迭代中移动2个步骤,以及慢的指针移动1步。因此,这是快速地指针可以在每次迭代中捕获1个元素。由于开始时这两个指针之间的距离是D., 我们需要D.迭代使这两个指针相遇。

因此,总运行时间是o(k + d), 在哪里K.是之间的元素数量头和循环的起始元素,和D.是两个指针之间的距离慢的指针到达循环。自从D.在最多的循环长度,整个时间复杂性也是上)

空间复杂性是O(1)因为我们只使用两个指针(慢的快速地)在算法中。

六,结论

在本教程中,我们显示了一个示例循环链接列表。此外,我们讨论了两个可以检查链接列表是否是循环链接列表的两个线性时间算法。

评论在本文上关闭!