LeetCode141判断链表中是否有环
1、问题阐述
给定一个链表,判断链表中是否有环。
2、问题分析
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
3、解题思路
3.1使用哈希表
遍历链表,将每一个节点存入一个哈希表中,利用哈希表不能存储相同元素的特性,判断是否存储成功,如果不成功,则存在环
public boolean hasCycle1(ListNode head) {
HashSet hashSet = new HashSet<ListNode>();
while (null != head) {
if (!hashSet.add(head)) {
return true;
}
head = head.next;
}
return false;
}
3.2快慢指针
使用两个指针分别遍历链表,如果存在环,则两个指针一定能在环中相遇,快指针一次走两步,慢指针一次走一步
public boolean hasCycle2(ListNode head) {
if (head == null) {
return false;
}
ListNode fast = head.next;
ListNode slow = head;
while (slow != fast) {
if (fast == null || fast.next == null) {
return false;
}
fast = fast.next.next;
slow = slow.next;
}
return true;
}
快慢指针有点类似于追击问题,如果是一条直线,快指针一定先到达终点,并且快慢指针不会相遇;但是如果是一个圆形跑道(有环),那快指针一定在某一个时刻追上慢指针,相当于慢指针被套圈了。如果我们能判断两指针相遇了,那么可以得出有环的结论。