如果单链表有环,求环的起始位置

本文介绍了一种高效的方法来找到单链表中环的起始位置。通过使用快慢指针技巧,首先判断链表中是否存在环,然后利用特定的数学关系找到环开始的地方。这种方法不需要额外的数据结构。

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

问题:如果单链表中存在环,求环的起始位置

解:在上篇文章中,利用追逐法判断一个单链表是否存在环。求环的起始位置,需要求解单链表的长度和环的长度的关系。如果确定了单链表的长度和环的长度的关系,那么环的起始位置就呼之欲出了。

在判断单链表中有两个指针P和q,p每次前进两步,q每次前进一步,p的速度是q的两倍。设单链表的长度为L,环的长度为R,链表起点到环起点的距离为X,当p和q相遇时,慢指针总共走了S步,在环内总共走了a步,快指针总共走了2S步,此时满足:2S=S+n*R,所以S=n*R。

S=X+a;

X+a=(n-1)*R+R=(n-1)*R+L-X

X=(n-1)*R+L-X-a

其中(n-1)*R+L-X表示相遇的位置,L-X表示环的长度,L-X-a表示相遇点到达环起始位置的距离。也就是说,链表起点到环起点的距离X等于从相遇位置到达环起点的距离。这一结论是解决这道题的理论基础。当快慢指针相遇后,让快指针p重新指向链表的起点位置,重新设置p的速度和q的速度相同,当p和q再次相遇时的位置就是环的起始位置。具体实现代码如下:

 1 linkNode *circleStart(linkNode *head)
 2 
 3 {
 4 linkNode *p,*q;
 5 p=q=head;
 6 while(p!=null && p->next!=null)
 7 {
 8 p=p->next->next;
 9 q=q->next;
10 if(p==q)
11 break;
12 }
13 if(p==q &&p!=null)
14 {
15 p=head;
16 while(p!=q)
17 {
18 p=p->next;
19 q=q->next;
20 }
21 return p;
22 }
23 else{
24 return null;
25 }
26 }

 

转载于:https://www.cnblogs.com/cynthia-dcg/p/6010113.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值