链表循环检测

时间:2016-06-06 07:27:41

标签: algorithm data-structures linked-list

我们如何能够证明将快速和慢速指针(从开头)移动1会使得循环节点遇到点?我的意思是我无法理解是什么赋予它一个保证的解决方案,即会议节点是循环节点(即节点)从周期开始)
我很清楚乌龟兔子循环检测基本上我正在谈论在检测到循环之后解除循环开始的节点。

2 个答案:

答案 0 :(得分:1)

这真的是一个非常简单的证明。首先,证明慢指针在最多n + k步之后将与快速指针匹配,其中n是到循环开始的链接数,k是循环的长度。然后你证明他们将在完全k步之后再次匹配。

他们见面的地方将是在任何地方

答案 1 :(得分:1)

在尝试正式证明这一点之前,您应首先查看一个示例,以便您可以更直观地了解并了解正在发生的事情。假设您有以下链表,其中3(在索引3处)指向1(在索引1处):

[0| ]->[1| ]->[2| ]->[3| ]--+
         ^                  |
         |                  |
         |                  |
         +------------------+

在逻辑进展中,您可以在缓慢增加一个位置并快速增加两个时观察以下内容:

  1. slow = index 0; fast = index 0
  2. slow = index 1; fast = index 2
  3. slow = index 2; fast = index 1
  4. 慢=索引3; fast = index 3(循环存在)
  5. 希望这有帮助!