142.环形链表

编程入门 行业动态 更新时间:2024-10-18 06:09:10

142.<a href=https://www.elefans.com/category/jswz/34/1763171.html style=环形链表"/>

142.环形链表

 

  环形链表问题是链表中的经典问题,接下来是142. 环形链表 II - 力扣(LeetCode)

的描述和详解 。

题目描述:

题目分析: 

situation1:当链表没有环形结构时,返回空:

situation2:当链表存在环形结构时,返回进入循环结构的那个结点。 

 

解题思路: 

由于链表存在环形结构,无法进行直接遍历。于是引出了双指针中的快慢指针来解决。 设定两个指针fast,slow,fast每次走两步,slow每次走一步。

 

 

 

可以看到,当链表没有环形结构时,fast或者fast->next会先为空,这时就可以直接返回NULL。当链表存在环形结构时,便可以抽象成下图,方便分析。

由于fast的速度是slow的两倍,说明fast会先进入环形,slow会后进入环形。

 

 

 

 那么进一步抽象成了我们高中物理所学的追击问题。我们假设这两个指针进入环形后的距离是S,由于fast的速度是slow的2两倍,指针每一走,距离S减1,直到在这个环形中S减到0,快慢指针一定会相遇。

 

假设两个指针相遇的结点为meet。

 

设head到pos距离为L,pos到meet的距离为X,设环长为C。

 

 可以通过推导就可以得出head到pos的距离等于meet到pos的距离

代码实现:

 

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode *slow=head,*fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(fast==slow){struct ListNode *meet=slow;while(meet!=head){head=head->next;meet=meet->next;}return meet;}}return NULL;
}

 这样当head和meet相等时,就是要返还的pos啦。

更多推荐

142.环形链表

本文发布于:2023-12-03 07:18:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1652577.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:环形   链表

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!