给定一个链表,检查链表是否有循环。下图显示了带有循环的链表。
image
解题思路
使用快慢两个指针遍历链表。
将慢指针(slow_p)一次移动一个节点,另快指针(fast_p)移动两个。 如果这些指针在同一节点相遇,则存在循环。如果指针不符合,则链接列表没有循环。
image.png
原理分析
1)当慢指针进入循环时,快指针已在循环内部。令快指针与慢指针的距离为k。
2)现在,如果考虑慢慢指针的移动,我们可以注意到它们之间的距离在每次迭代后增加一。经过一个迭代(慢指针=慢指针的下一个节点,快指针=快指针的下一个节点),快慢指针的距离变为k + 1,经过两次迭代为k + 2,依此类推。当距离变为环的长度n时,它们将会合,因为它们在长度为n的环中运动。
例如,我们可以在下图中看到,初始距离为2。经过1次迭代,距离变为3,经过2次迭代,距离变为4。经过3次迭代,它变为距离0的5。它们相遇。