前言
本篇为链表的特殊链表----环形链表的专题,题目从简单到难
一、环形链表
1.题目介绍
题目在141. 环形链表
2.思路
假设当fast指针在slow指针进入环的入口时,slow距入口X那么fast走的距离为L+X+nR(
nR就是一个循环,不影响相遇
),slow走的距离为L
假设slow每一步走x步,slow走2x步,那么两者的差就是x步,如果总共走了t次
那么两者差就是xt次,x是一个单位,所以xt可以是任何数,那么就可以等于X
所以两者总是可以相遇
3. 代码
bool hasCycle(struct ListNode *head) {
struct ListNode *slow=head;
struct ListNode *fast=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(slow==fast)
{
return true;
}
}
return false;
}
二、环形链表 II
1.题解
题目在环形链表 II
2.思路
在上一题的基础上
所以我们有这结论
让一个指针从链表起始位置开始遍历链表,同时让一个指针从环的相遇点的位置开始绕环
运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇
3.代码
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode *fast,*slow;
fast=slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(slow==fast)
{
struct ListNode *mid=slow;//mid记录相遇点
slow=head;
while(mid!=slow)//mid从从相遇点出发,slow从起点出发
{
mid=mid->next;
slow=slow->next;
}
return slow;
}
}
return NULL;
}