检测链接列表中的循环

时间:2011-10-09 18:49:31

标签: loops data-structures linked-list

如何仅使用单个指针检测链表中的循环? (不要想要慢速和快速指针(Hare and Tortoise))

3 个答案:

答案 0 :(得分:1)

如果你不介意额外的O(N)内存,你可以使用hastable来存储被访问的节点,如果你不介意额外的O(N)内存。

在每个节点上,检查该节点是否已存在于哈希表中。如果是,你找到了一个循环。否则,将其添加到哈希表中,然后转到下一个节点。

答案 1 :(得分:1)

Brent's algorithm显然是最好的:对于无循环列表,它只需访问列表一次,而Floyd的乌龟和野兔需要重新访问一半的节点。对于带有循环的列表,它永远不会在循环中“旋转”比Floyd更长;在最好的情况下,当Floyd需要很多时,只需要一个周期。想想一个长的无循环序列,然后是长度为1的循环。在这种情况下,布伦特的最佳情况是在循环访问一次后检测循环 - 所以访问每个节点一次;而弗洛伊德平均要三次访问每个节点。

基本思想是访问链表并将当前节点的指针与一个已访问过的节点进行比较。也就是说,每个被访问节点的一个指针比较。指针会根据简单的逻辑不时更新。

答案 2 :(得分:0)

如果节点由value和指向下一个节点的指针组成,则可以使用列表创建指向第一个节点的指针。您可以在每个节点上检查指针是否具有与指向第一个节点的指针相同的值。