方案一、利用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的距离
标签:node,---,head,slow,fast,next,链表,有环 From: https://www.cnblogs.com/bimingcong/p/18259420