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;
}

快慢指针有点类似于追击问题,如果是一条直线,快指针一定先到达终点,并且快慢指针不会相遇;但是如果是一个圆形跑道(有环),那快指针一定在某一个时刻追上慢指针,相当于慢指针被套圈了。如果我们能判断两指针相遇了,那么可以得出有环的结论。

posted @ 2021-03-09 22:30  千叶翔龙  阅读(68)  评论(0)    收藏  举报