如何判断单链表有环及正确性证明

版权声明:打字写文章不容易,如果转载请注明出处,谢谢~ https://blog.csdn.net/mucaoyx/article/details/81395782

双指针判断单链表是否有环的正确性证明

​ 首先介绍一下这个问题。给你一个单链表,需要找到一个方法进行判断是否有环的存在。这篇文章主要证明一下,为什么存在环的情况下两个指针(slow和fast指针)就一定会相遇。

判断单链表是否有环

​ 使用两个slow, fast指针从头开始扫描链表。指针slow 每次走1步,指针fast每次走2步。如果存在环,则指针slow、fast会相遇;如果不存在环,指针fast遇到NULL退出。

  就是所谓的追击相遇问题:

这里写图片描述

证明存在环就会导致两个指针(slow和fast指针)一定会相遇:

首先,如果存在环,那么快指针和慢指针一定会同时进入到环中。假设当slow指针刚进入环时,fast指针所在的结点编号是0(现在只考虑环中的结点),slow指针所在结点编号是k,那么就环展开就像如下图所示:

这里写图片描述

​ 由于slow和fast指针都是在环中的,所以可以将环展开的直线无限延伸。如果没有限制,slow和fast指针可以在环中无限的走下去。

​ 假如说是fast和slow指针可以相遇,且相遇的位置为k+m(其中m表示slow指针进入环后走了m步就和fast指针相遇了),那么m一定是有解的。

​ 由于slow指针从k结点走了m步就和fast指针相遇了,则一定有下面的等式成立:

k + m = 2 m ( 1 )

​ slow指针走了m步,会到达 k + m 结点处,相应的fast走了m步会到达 2 m 结点,由于是两个指针走了m步相遇,所以一定有上面的等式(1)成立。由等式(1)可知,m一定是有解的,且 m = k

综上述 slow指针进入环后,只要再走k步(fast落后slow指针的结点数)就一定会和fast指针相遇。slow指针进入环后,假设fast指针再往前走k个节点就会到达当前slow指针的位置,那么当slow指针和fast指针同时移动的时候,slow指针每向前移动一个节点,fast指针就会向前移动两个节点,fast与slow之间的距离就会缩短一个,所以当移动k步之后,fast指针就会和slow指针相遇。
如果证明有误,欢迎留言指正~

参考资料:检测单链表是否有环

猜你喜欢

转载自blog.csdn.net/mucaoyx/article/details/81395782
今日推荐