【发布时间】:2013-11-25 02:23:39
【问题描述】:
我了解 Floyd 循环检测算法的概念。得出的结论是,如果乌龟的行进速度是兔子的两倍,并且如果乌龟在一个循环中领先 k 米,那么乌龟和兔子将在循环之前遇到 k 米。
在单链表的情况下,指针 A 的移动速度是指针 B 的两倍。这意味着如果指针 B 需要 k 步才能到达循环的入口点(我们还不知道它在哪里),指针 A 将在循环内具有 k 个节点的领先位置。因此,两个指针将在循环的入口点之前遇到 k 个节点。因此,如果我们将指针 B 移回头指针并将指针 A 保持在交汇点(现在两个指针都离入口点有 k 个节点),并以相同的速度移动,它们将在入口点相遇循环。
您如何证明该算法在以下边界情况下有效?
- 最后一个节点循环回头部的链表。在这种情况下,起始值 k 是多少?
- 一个超长的链表,1000个节点,最后有一个小循环,3个节点。指针 A 将领先 1000,这意味着当指针 B 到达循环的入口点时,A 已经循环了很多次。
- 如果有 1 个节点的循环怎么办?
这不是家庭作业。一位面试官告诉我,如果我有一个小循环,这个算法将无法工作。他没有解释原因。
【问题讨论】:
-
如果面试官真的这么说,那他就错了。
标签: algorithm linked-list floyd-cycle-finding