下面是使用快慢指针法判断Java链表是否有环的代码,添加了便于快速记忆的注释:
public class Solution {
public boolean hasCycle(ListNode head) {
// 快指针和慢指针初始都指向头节点
ListNode fast = head;
ListNode slow = head;
// 快指针每次移动两步,慢指针每次移动一步
// 如果链表有环,快指针一定会追上慢指针
while (fast != null && fast.next != null) {
fast = fast.next.next; // 快指针移动两步
slow = slow.next; // 慢指针移动一步
// 快慢指针相遇,说明有环
if (fast == slow) {
return true;
}
}
// 快指针到达链表尾部,说明无环
return false;
}
}
// 辅助记忆口诀:
// 1. 快慢指针同时跑
// 2. 快二慢一要记牢
// 3. 相遇即环不用疑
// 4. 快到终点没烦恼
关键点记忆:
- 初始条件:快慢指针都从head出发
- 移动规则:快指针每次两步,慢指针每次一步
- 终止条件:
- 相遇则有环(return true)
- 快指针到达null则无环(return false)
- 时间复杂度:O(n),空间复杂度O(1)
这个算法的核心思想可以类比为操场跑步:如果两个人速度不同,在环形跑道上一定会相遇,而在直道上快的人会先到达终点。