Java 链表环检测:快慢指针法,代码注释,10 秒记住核心逻辑

62 阅读1分钟

下面是使用快慢指针法判断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. 快到终点没烦恼

关键点记忆:

  1. 初始条件:快慢指针都从head出发
  2. 移动规则:快指针每次两步,慢指针每次一步
  3. 终止条件
    • 相遇则有环(return true)
    • 快指针到达null则无环(return false)
  4. 时间复杂度:O(n),空间复杂度O(1)

这个算法的核心思想可以类比为操场跑步:如果两个人速度不同,在环形跑道上一定会相遇,而在直道上快的人会先到达终点。