算法积累-Java如何判断链表有环

57 阅读1分钟
/**
 * 判断链表是否有环
 * 在Java中,判断一个链表是否有环可以通过使用快慢指针的方法来实现。
 * 快指针每次走两步,慢指针每次走一步,如果链表有环,那么快慢指针最终会在环中相遇。
 * 如果链表不存在环,那么快指针最终会走到链表末尾。
 */
public class LinkedListCycle {
    static class ListNode {
        int data;
        ListNode next;

        ListNode(int x) {
            data = x;
            next = null;
        }
    }

    // 判断链表是否有环
    public static boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
            return false; // 如果链表为空或只有一个节点,则肯定无环
        }
        ListNode slow = head;
        ListNode fast = head.next;
        while (slow != fast) {
            if (fast == null || fast.next == null) {
                return false; // 如果快指针走到链表末尾,则肯定无环
            }
            slow = slow.next;// 慢指针每次走一步
            fast = fast.next.next; // 快指针每次走两步
        }
        return true; // 如果快指针追上慢指针,则有环
    }

    public static void main(String[] args) {
        ListNode node1 = new ListNode(5);
        ListNode node2 = new ListNode(3);
        ListNode node3 = new ListNode(7);
        ListNode node4 = new ListNode(2);
        ListNode node5 = new ListNode(6);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        
        node5.next = node2;// 注掉此行则打印输出false

        boolean hasCycle = hasCycle(node1);
        System.out.println("该链表是否有环hasCycle:" + hasCycle);
    }
}