如何判断链表有无环

1. 流程图

journey
    title 判断链表有无环
    section 步骤
        判断链表是否为空 --> 初始节点
        判断链表是否只有一个节点 --> 单节点
        使用快慢指针遍历链表 --> 快慢指针
            判断快慢指针是否相遇 --> 相遇
            判断快指针是否到达链表尾部 --> 未相遇

2. 代码实现

步骤1:判断链表是否为空

// 判断链表是否为空
if (head == null) {
    // 链表为空,没有环
    return false;
}

步骤2:判断链表是否只有一个节点

// 判断链表是否只有一个节点
if (head.next == null) {
    // 链表只有一个节点,没有环
    return false;
}

步骤3:使用快慢指针遍历链表

// 定义快慢指针,初始指向链表头节点
ListNode slow = head;
ListNode fast = head;

步骤4:判断快慢指针是否相遇

while (fast != null && fast.next != null) {
    slow = slow.next; // 慢指针每次移动1步
    fast = fast.next.next; // 快指针每次移动2步

    if (slow == fast) {
        // 快慢指针相遇,链表有环
        return true;
    }
}

步骤5:判断快指针是否到达链表尾部

// 快指针到达链表尾部,链表没有环
return false;

3. 完整代码

public class Solution {
    public boolean hasCycle(ListNode head) {
        // 判断链表是否为空
        if (head == null) {
            // 链表为空,没有环
            return false;
        }
        
        // 判断链表是否只有一个节点
        if (head.next == null) {
            // 链表只有一个节点,没有环
            return false;
        }
        
        // 定义快慢指针,初始指向链表头节点
        ListNode slow = head;
        ListNode fast = head;
        
        // 使用快慢指针遍历链表
        while (fast != null && fast.next != null) {
            slow = slow.next; // 慢指针每次移动1步
            fast = fast.next.next; // 快指针每次移动2步
            
            if (slow == fast) {
                // 快慢指针相遇,链表有环
                return true;
            }
        }
        
        // 快指针到达链表尾部,链表没有环
        return false;
    }
}

4. 总结

以上就是判断链表有无环的完整流程和代码实现。通过使用快慢指针来遍历链表,当快慢指针相遇时,即可判断链表存在环。如果快指针到达链表尾部仍未相遇,则链表没有环。

判断链表环的存在性是面试中常见的问题,使用快慢指针的方法可以在O(n)的时间复杂度内解决该问题。需要注意的是,使用快慢指针时,要确保快指针每次移动两步,慢指针每次移动一步,以确保相遇的正确性。

希望通过本文,能够帮助刚入行的小白开发者理解并掌握判断链表有无环的方法。