在这篇博客中,我们将深入探讨链表环结构的检测方法: Floyd算法的原理:如何通过快慢指针检测环? 环入口的定位:如何找到环的起点? 通过这篇博客,我会对链表中的环结构进行相关证明解释,总结学习。
题目链接:https://leetcode.cn/problems/linked-list-cycle/description/
题目描述:
代码实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
struct ListNode*slow,*fast;
slow = fast = head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
return true;
}
return false;
}
代码解释:
这个题目的实现逻辑比较简单,我们定义快慢指针来进行实现,fast指针每次走2步,slow指针每次走1步,当快指针和慢指针相遇的时候,如果链表中存在环,则返回 true 。否则,返回 false。
题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/ 题目描述:
代码实现1:
struct ListNode* detectCycle(struct ListNode* head) {
struct ListNode* fast;
struct ListNode* slow;
fast = slow = head;
while (fast && fast->next)
{
//快慢指针依次走
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
{
struct ListNode* start = head;
struct ListNode* meet = slow;
while (meet != start)
{
meet = meet->next;
start = start->next;
}
return meet;
}
}
return NULL;
}
代码解释1:
代码实现2:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
struct ListNode* tailA=headA,*tailB=headB;
int lenA=1,lenB=1;
while(tailA)
{
tailA=tailA->next;
++lenA;
}
while(tailB)
{
tailB=tailB->next;
++lenB;
}
int gap=abs(lenA-lenB);
struct ListNode* longlist=headA,*shortList=headB;
if(lenA<lenB)
{
longlist=headB;
shortList=headA;
}
while(gap--)
{
longlist=longlist->next;
}
while(longlist!=shortList)
{
longlist=longlist->next;
shortList=shortList->next;
}
return longlist;
}
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode* fast;
struct ListNode* slow;
fast=slow=head;
while(fast&&fast->next)
{
//快慢指针依次走
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
//转换成求交点
struct ListNode* meet=slow;
struct ListNode* lt1=meet->next;
struct ListNode* lt2=head;
meet->next=NULL;
return getIntersectionNode(lt1,lt2);
}
}
return NULL;
}
代码解释2:
问题1: 为什么slow走1步,fast走2步,他们会相遇吗?会不会错过?请证明
问题:为什么slow走1步,fast走3步(x>=3),他们会相遇吗?会不会错过?请证明
感谢您的阅读支持!!! 后续会持续更新的!!! 文末投票支持一下!!!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有