-
一般而言的单链表的尾部结点的next域指向null,是没有环的;
- 当单链表的尾部结点的next域指向其前面任一结点时,则证明链表有环。
思路分析
- 定义两个指针,快指针和慢指针,快指针步长为2,慢指针步长为1。
- 如果链表有环,则两个指针一定可以在环内相遇(为什么?可以很明确的一点是,如果链表没有环,两个指针永远不会相遇。如果有环,数学上可以证明,两个指针一定会相遇。也可以想象,随着快慢指针的一步一步向前,两个指针都会进入环内,然后两个指针在环内开始不断的跑圈,一个跑的快,一个跑的慢,总会有一个时间点,两个会相遇)
-
特例
public static boolean hasCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
return true;
}
}
return false;
}
检测链表有环
方法二是常规实思路先用HashMap记录每个节点,如果遇到重复的节点就是环形链表入口点
public class Solution {
public ListNode det