删除链接列表中的循环

时间:2015-05-19 18:57:44

标签: algorithm pointers linked-list

问题:如果循环存在于链表

中,找到循环的起始节点

方法:

(1)使用Hare-Tortoise算法,查找是否存在循环(此步骤无问题)

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

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

参考文献:

Problem and Solution

Partially Explained Logic(Refer second approach in this blog)

1 个答案:

答案 0 :(得分:1)

设T是乌龟所经过的链接数,让S为到达循环之前遍历的链接数。

我们知道沿着周期旅行的T链接会让你回到你开始的地方,因为乌龟和野兔分别在旅行T和2T链路后到达相同的地点P.如果你从P旅行S链接,这相当于从开始旅行S链接然后旅行T链接,这相当于从一开始就旅行S链接。

因此,当从列表开始行进的指针已经行进了S个链接时,它到达循环的开始,并且它与从P行进的指针相遇。