题目链接:
力扣https://leetcode.cn/problems/linked-list-cycle/submissions/
解题思路:
1. 带环链表不能遍历,否则会造成死循环
2. 定义俩个快慢指针,慢指针每次向后走一步,快指针每次向后走俩步。即快慢指针相差一步。
所以如果一个链表中存在环结构,
则快指针一定比慢指针先进入环结构,随着快指针进入环内运动循环,慢指针最终也会进入环内。
因为快慢指针均进入了一个环结构,所以不会遇到 NULL 指针,一直在循环。
这会使快慢指针最终会相遇,即指向的地址相同
而如果这个 单链表中 不存在环结构,则快指针最终会遇到 NULL 指针结束循环
这实际上是根据带环链表的结构特点去解题
3. 不带环结构的单链表需要考虑其结点的个数是奇数个还是偶数个
4. 【思考】:为什么快慢指针在环结构内最终一定会相遇?
为什么快指针每次走两步,慢指针走一步可以?
假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。
当慢指针刚进环时,可能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。
此时,两个指针每移动一次,之间的距离就缩小一步,不会出现每次刚好是套圈的情况,
因此:在满指针走到一圈之前,
快指针肯定是可以追上慢指针的,即相遇
快指针一次走3步,走4步,...n步行吗?
不行
参考代码:
bool hasCycle(struct ListNode *head)
{
struct ListNode *fast , *slow;
slow = head;
fast = head;
while (fast && fast->next)//不带环结构的单链表的结点个数分奇数个和偶数个;
//存在偶数个结点时是 fast 走到 NULL
//存在奇数个结点时是 fast->next 走到 NULL
{
slow = slow->next;
fast = fast->next->next;//比慢指针多走一步,每次向后行走俩步
if (slow == fast)
{
return true;
}
}
return false;
}



