题目
给你一个链表的头节点 head
,判断链表中是否有环。
解法一
思路
快慢指针。 快的一次跑2步,慢的一次跑1步。如果没有环,一定到null了;如果有环,那么快慢指针总是能在环里相遇。
代码
public boolean hasCycle(ListNode head) {
if (head == null) {
return false;
}
ListNode p1 = head;
ListNode p2 = head.next;
while (p2 != null && p1 != p2) {
ListNode p = p2.next;
if(p == null) {
return false;
}
p2 = p.next;
p1 = p1.next;
}
return p2 == null ? false : true;
}
update20220509
public boolean hasCycle(ListNode head) {
if (head == null) {
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
return true;
}
}
return false;
}
解法二
思路
遍历一遍,如果有重复出现,那么就是有环;否则肯定到null。
代码
public boolean hasCycle(ListNode head) {
Set<ListNode> set = new HashSet<>();
ListNode p = head;
while (p != null) {
if (set.contains(p)) {
return true;
}
set.add(p);
p = p.next;
}
return false;
}