判断链表是否有环的思路,以及验证其正确性

在网上找了下判断单链表是否有环的文章,其中都是说取两个指针,一个指针p1指向头,另外一个指向头指针的下一个结点p2,然后通过循环,循环体中p1每次向下移动一步,p2向下移动两步,如果最终两个指针的值相等则判断有环。

这个算法很简单,但是其中转了一个弯,要稍微想下才知道为什么这样能判断单链表有环。

假如一个单链表有环,那么最终p2会先进环,p1后进,进了环之后,这个场景就像是围绕着操场跑步,两个人都是朝同一个方向跑步,一个速度快,一个速度慢,那么只要跑的圈数足够,总有一天跑的快的和跑的慢的最终会相遇,也就是跑的快的追上跑的慢的,但这里还有一个不同,跑步的场景后面的人不会一下子从前面的人上方飞过,而链表中的追赶则有这种情况出现,假如p2每次向下移动三步,p1移动一步,假如此时p2隔着p1一步远,那下一趟循环p2则直接跳到p1的前面去了,相遇的机会则错过了,而通过设置p2每次移动两步,p1移动一步则不会发生这种情况,因为假如p2和p1隔着n步远,根据p2和p1的速度差为1,可得出p2和p1每趟循环之后相隔的距离会减一,这样迟早有一天相隔的距离为0,此时也就是相遇的那一天。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值