求链表内环的入口节点-Java

本文介绍了一种通过快慢指针来确定链表中环入口节点的方法。利用快慢指针在环内相遇的特点,从头结点和相遇点同时出发,再次相遇时即为环的入口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

步骤:
1.设置快慢两个指针,slow和fast,每次slow走一步slow.next,而fast走两步fast.next.next.
2.如果链表有环肯定可以在环内的一个节点相遇.
3.此时,slow指向相遇的节点,而fast指向头结点,然后slow和fast继续走,每次都走一步,slow.next,fast.next.当slow和fast指向同一个节点的时候就是入口节点,那么这是为什么呢?

为什么slow.next和fast.next指向的同一节点就是入口节点呢?
一开始,判断链表有没有环时,当fast若与slow相遇时,slow肯定没有走遍历完链表(此处我还没有证明,但举例好像都是),而fast已经在环内循环了n圈(1<=n)。假设slow走了s步,则fast走了2s步(fast步数还等于s 加上在环上多转的n圈)。设环长为r,则:
这里写图片描述

//fast是slow速度的两倍,那么他们走的距离就必然满足下面的式子,fast比slow多走的就是绕环的圈数
2s=s+nr;
s=nr;

设整个链表长L,入口节点与相遇节点距离为x,起点到环入口节点的距离为a。

a+x=s
所以a+x=nr
a+x=(n-1)r+r=(n-1)r+L-a
所以a=(n-1)r +(L-a-x)

(L – a – x)为相遇节点到环入口点的距离,由此可知,从链表头到环入口点等于(n-1)倍的循环内环+相遇点到环入口点,于是我们从链表头、与相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。

转载于:https://www.cnblogs.com/loren-Yang/p/7466122.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值