leetcode141:环形链表

package com.mxnet;

import java.util.HashSet;

public class Solution141 {
    public static void main(String[] args) {

    }

    /**
     * 给你一个链表的头节点 head ,判断链表中是否有环
     * @param head
     * @return
     * 思路:
     * 1. 使用hash结构判断链表中是否有环
     * 2. 由于hash结构的元素唯一性,
     * 3. 若出现重复元素,则说明链表有环
     * 4. 若无重复元素,则说明链表无环
     */
    public boolean hasCycle1(ListNode head) {
        //若链表只有一个元素或为空,则不可能有环
        if (head == null || head.next == null){
            return false;
        }
        //使用hash结构
        HashSet<ListNode> listNodes = new HashSet<>();
        while (head != null){
            //遍历链表所有元素,并将添加到hash集合中,若添加失败说明重复,返回true
            if (!listNodes.add(head)){
                return true;
            }
            //链表元素后移
            head = head.next;
        }
        //若未出现重复返回false
        return false;
    }

    /**
     * 使用快慢指针的思路
     * @param head
     * @return
     * 思路:
     * 1. 使用快慢指针,定义两个指针
     * 2. 快指针每次移动两步,慢指针每次移动一步,若快指针超过慢指针,说明有环
     * 3. 若快指针到达链表末尾,说明无环
     */
    public boolean hasCycle(ListNode head) {
        //判断链表节点是否为空或只有一个元素
        if (head == null || head.next == null){
            return false;
        }
        //定义快慢指针
        ListNode fast = head.next;
        ListNode slow = head;
        while (fast != slow){
            //若快指针已经到达链表末尾,则说明无环
            if (fast == null || fast.next == null){
                return false;
            }
            //快指针移动两步,慢指针移动一步
            fast = fast.next.next;
            slow = slow.next;
        }
        return true;
    }
}
posted @ 2022-08-26 21:16  mx_info  阅读(12)  评论(0编辑  收藏  举报