单链表有环:是指单链表中某个节点的 next 指针指向的是链表中在它之前的某一个节点,这样在链表的尾部形成一个环形结构。
解决思路:设置两个指针,一个指针一次向前走一步(慢指针),另一个指针一次向前走两步(快指针)。若链表有环,则快指针一定可以追上慢指针;若链表无环,则会走到链表末端。
public class QuickSlowPointer {
public boolean hasCycle(ListNode head) {
ListNode slow = head;
ListNode quick = head;
/*
若链表有环,则快指针一定可以追上慢指针;若链表无环,则会走到链表末端。
走到链表末端的两种情况:
1.当 quick == null 时,此时的 quick 为最后一个元素的 next。
2.当 quick.next == null 时,此时的 quick 为最后一个元素,同时也可以规避空指针异常。
*/
while (quick != null && quick.next != null) {
slow = slow.next; // 慢指针
quick = quick.next.next; // 快指针
// 表示存在环
if (slow == quick) {
return true;
}
}
return false;
}
}
// 单链表
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}