力扣打卡之环形链表

43 篇文章 0 订阅

题目描述

给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next
指针再次到达该节点,则链表中存在环。

如果有环返回true,没有环返回false!

解题思路

① 使用set进行求解

我们判断当前节点的下一个节点的值是不是存在,我们怎么可以判断有没有环?

可以将每次选取到的元素添加到我们的set集合里面,当我们添加不进去的时候,那就说明这个节点已经存在在我们的set集合里面了,也就说明存在环!

②使用双指针的方式进行求解

我们使用双指针怎么求解?
我们用一个快指针一个慢指针,当快指针等于慢指针的时候,我们就只知道这里肯定存在环了!

代码展示

①使用set

public static boolean hasCycle(ListNode head){
    Set<ListNode> set=new HashSet<ListNode>();
    while(head!=null){
        if(!set.add(head)){   //如果此时添加不进去,就返回true,表示已经形成环了!
            return true;
        }
        head=head.next;
    }
    return false;
}

②使用双指针

public static boolean hasCycle(ListNode head){
    if(head==null || head.next==null)  return false;
    ListNode slow=head;
    ListNode quick=head.next;
    while(slow!=quick)
     {
        if(quick==null || quick.next==null)
            return false;
        slow=slow.next;
        quick=quick.next.next;  //可以多走一步  
     }
    return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值