方案一、利用Set集合不会重复的原理

    boolean judgeCycle(Node head) {
        Set<Node> visited = new HashSet<>();
        Node node = head;
        while (node != null) {
            if (visited.contains(node))
                return true;
            visited.add(node);
            node = node.next;
        }
        return false;
    }

方案二、利用追逐算法,类似于定义两个指针,一个跑的快每次跑2步,一个跑得慢每次跑1步,如果有环那么这俩指针一定会相遇:

当两者相遇之后把跑得快的指向链表的头,然后每次跑一步,继续去追之前跑得慢的

   Node findCycleStartNode(Node head) {
        Node slow = head, fast = head;
        while (true) {
            if (fast == null || fast.next == null) return null;
            slow = slow.next;
            fast = fast.next.next;
            if (fast == slow) break;//到这里说明相遇了  那么就是有环
        }
//此时将跑得快的指向链表头,每次走一步,和跑得慢的再次相遇的位置就是环的入口,具体可以看示意图,因为链表头到环入口的距离等于第一次相遇点m1到环入口的距离, fast
= head; while (slow != fast) { slow = slow.next; fast = fast.next; } return fast; }

 A到B的距离等于C到B的距离

 

posted on 2024-06-20 19:50  毕哥  阅读(2)  评论(0编辑  收藏  举报