给定一个链表,判断链表中是否有环。有环返回true,无环返回false;
思考:能用 O(1)(即,常量)内存解决此问题吗?如何遍历整个链表,并判断是否有环?
细节:注意空链表和只有一个结点的链表
解法一:HashSet
——创建一个结点集合,遍历链表中的结点,每次遍历都去判断集合中是否存在该结点,如果不存在,就存入集合,如果存在则说明链表有环
// hashSet
public boolean hasCycle1(ListNode head) {
HashSet<ListNode> set = new HashSet<>();
ListNode cur = head;
while (cur != null) {
if (set.contains(cur)) {
return true;
} else {
set.add(cur);
}
cur = cur.next;
}
return false;
}
解法二:快慢指针(追及问题)
——这种解法比较巧妙,slow走一步,fast走两步,如果二者重合了,则有环。注意循环条件
public boolean hasCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (slow != null && fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
return true;
}
}
return false;
}
end.