java - 关于链表去环逻辑的问题

标签 java algorithm floyd-cycle-finding

下面是使用Floyd慢速算法发现列表中存在循环后的代码。

我们如何确定begin和tortoise会在循环开始时相遇?

Node begin = head;
tortoise = tortoise.next;
while (begin != tortoise) {
    begin = begin.next;
    if (tortoise.next == begin) {        // Find the position of the loop and mark the node as null

        tortoise.next = null;
        return;
    }
    tortoise = tortoise.next;
}

如有任何帮助,我们将不胜感激!

最佳答案

Diagram for reference

让我们看看您发布的代码之前的第一部分。

考虑

  • 慢指针(乌龟)和快指针(野兔)。快指针移动两次 慢速指针的速度,因此当慢速指针移动了距离“d”时,快速指针也移动了 距离“2d”。
  • 从起点到交点的长度为x(参见图表)。
  • 它们在距交点长度为 y 的随机点处相遇(参见图表)。
  • 从交汇点到交点的长度为 z(参见图表)。
  • 循环长度为 y+z;
  • 当慢与快相遇时。 Slow 已走过距离 x+y (比如 d)
  • 快速移动了距离 x+y+z+y (将是 2*d)

  • 2*d=x+2y+z

  • 2(x+y)=x+2y+z

  • 2x+2y=x+2y+z

  • x=z(已证明)

现在来看您发布的代码。

因为已经证明,在第一个交点之后 x 将等于 z(假定野兔的速度是乌龟的两倍),然后从开头移动一个指针,然后从第一个交点移动一个指针到交点(即环形)。

关于java - 关于链表去环逻辑的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58217211/

相关文章:

java - 访问其他 fragment 数据

java - 在代码中使用 set 或 List

algorithm - 非常大图的 A* 算法,对缓存快捷方式有什么想法吗?

algorithm - 在 Floyd 循环查找算法中跳过一个以上的节点

algorithm - 弗洛伊德算法 - SIGTSTP 错误

Java - 图形 - 在 JPanel 上添加另一个形状

java - Spring RestTemplate 配置策略从单个 API 调用多个 rest 服务

algorithm - 进一步简化并找到 c1 和 c2 (Big Theta)

vb.net - 合并排序的 Visual Basic 实现产生混有 0 的结果