【链表】LeetCode141. 环形链表

80 阅读1分钟

题目

给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。
如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。

示例

输入: head = [3,2,0,-4], pos = 1
输出: true
解释: 链表中有一个环,其尾部连接到第二个节点。

快慢指针实现

主要思路

  1. 如果链表有环,慢指针每次走一步,快指针每次走两步
  2. 快慢指针最终会相遇
  3. 如果链表没有坏,快指针最终会为null,然后结束while循环

代码

public boolean hasCycle(ListNode head) {
        if(head == null){
            return false;
        }
        ListNode slow = head;
        ListNode fast = head;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
            if(slow ==fast){
                return true;
            }
        }
        return false;
    }

Set集合实现

主要思路

  1. 主要利用Set集合不存储重复元素的特点
  2. 遍历链表节点,将节点添加到Set集合中
  3. 在添加节点时,先判断节点是否已经在Set集合里
  4. 如果存在,说明有环
  5. 如果不存在,就将节点添加到集合中

代码

 public boolean hasCycle(ListNode head) {
        if(head == null){
            return false;
        }
        Set<ListNode> set = new HashSet<>();
        while(head != null){
            if(set.contains(head)){
                return true;
            }
            set.add(head);
            head = head.next;
        }
        return false;
    }