如何找到使用两个指针在链接列表中是否存在任何循环?

时间:2010-08-02 07:07:42

标签: c++ c loops linked-list

  

可能重复:
  How to determine if a linked list has a cycle using only two memory locations.

你好我在接受采访时被问到如何只使用两个指针在链接列表中找到一个循环。

我做了以下事情:

1)每次都找到链接列表的中心

2)通过在末尾迭代这两个指针,如果没有指向同一个节点,则指向同一个节点并找到null,然后链接列表中没有循环。

有没有有效的方法来做到这一点......?

提前完成。

3 个答案:

答案 0 :(得分:9)

我认为你正在寻找Floyd's cycle detection algorithm,也被称为“龟和野兔算法”。我们的想法是将一个指针(“乌龟”)设置为 列表中的第一个节点,以及下一个项目的另一个指针(“野兔”)。然后进去 每一步,“乌龟”指针前进一个位置,“野兔”前进两步。在每次迭代之后,检查指针以查看它们是否指向 同一个节点。如果发生这种情况,该节点必须是循环的一部分。

要找到循环的开始,将两个指针中的一个重新定位到 列表的开头,而另一个则保留在当前位置。然后两个指针 这两次指针每次迭代只需一步,直到它们再次相遇。这个(第二个)会合点是循环中的第一个节点。

答案 1 :(得分:2)

每次迭代移动一个指针1个节点,每次迭代移动另一个指针2个节点。如果快节点看到null,则没有循环,如果快速指针看到慢速指针,则存在循环。解决。

解决方案是以乌龟和野兔为蓝本的着名解决方案。

答案 2 :(得分:1)

这个的通用解决方案是使用两个指针和一个循环。在每次循环迭代时,一个指针移动到下一个节点。另一个指针仅每隔一次迭代移动一次。如果在达到第一个==秒之前达到NULL,则列表没有循环。