【问题标题】:Removing Cycle in Linked List删除链表中的循环
【发布时间】:2015-07-31 18:31:42
【问题描述】:

问题:如果链表中存在循环,则查找循环的起始节点

方法:

(1)使用Hare-Tortoise算法,判断是否存在循环(此步骤没有问题)

(2)设P为兔子和乌龟相遇的节点。设H为链表上的头指针。从H和P一次遍历一个节点,直到它们相遇。

疑问:(2) 背后的逻辑。从 H 和 P 一次遍历一个步骤如何确保它们在循环开始时相遇?

参考资料:

Problem and Solution

Partially Explained Logic(Refer second approach in this blog)

【问题讨论】:

    标签: algorithm pointers linked-list


    【解决方案1】:

    令T为乌龟经过的链接数,令S为到达循环前经过的链接数。

    我们知道沿着循环走 T 连线会让你回到起点,因为乌龟和野兔分别在走完 T 连线和 2T 连线后到达同一个地点 P。如果从 P 走 S 路,就相当于从起点走 S 路,再走 T 路,也就是从起点走 S 路。

    因此,当从链表起点出发的指针经过S个链接时,到达循环起点,与从P出发的指针相遇。

    【讨论】:

    • “我们知道沿着循环走 T 环会让你回到你开始的地方,因为乌龟和兔子分别在走 T 和 2T 环后到达同一个点 P”。这是我的疑问。我们怎么知道?请详细说明
    • @user3409814:认真的吗? 那是让你感到困惑的部分?好的,假设您从一开始就旅行 T 链接。您到达乌龟的位置,即 P。您继续前往另一个 T 链接。你到达了野兔的位置,也就是 P。因此,从 P 行进 T 链接会让你回到 P。通过循环结构的对称性,我们可以看出,从循环中的任何点行进 T 链接都会让你回到哪里你开始了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 2015-06-05
    • 2010-12-20
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多