

前言
链表带环问题是数据结构中的经典考点,核心在于通过快慢指针法判断环的存在并定位入口点。本文从 LeetCode 两道真题出发,拆解快慢指针的相遇逻辑与数学推导,结合代码实现与严谨证明,清晰呈现带环链表的解题思路。
一、带环链表
1.1 题目
链接:带环链表

1.2 算法原理
核心思想: 快慢指针 --- 相遇即为链表带环
创建两个指针 — slow 和 fast 初始指向 head,遍历链表 slow 每次走一步,fast 每次走两步,那么就会分成两种情况: • 链表不带环:那么 fast 一定可以遍历到 NULL。 • 链表带环:fast 一定比 slow 先走进循环,在环内不断循环,当 slow 也进入循环时,如果链表带环则与 fast 必定能相遇。
1.3 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode* ListNode;
bool hasCycle(struct ListNode *head){
ListNode slow = head;
ListNode fast = head;
// 如果不相遇分为奇数个和偶数个
while(fast && fast->next){
slow = slow->next;
fast = fast->next->next;
// 链表相遇
if(fast == slow) return true;
}
// 能跳出循环 --- 不带环
;
}








