JAVA——环形链表

问题1:给你一个链表的头节点 head ,判断链表中是否有环。如果链表中存在环 ,则返回 true 或者false 。
在这里插入图片描述
方法:首先判断链表是否为空,以及是否只有一个结点。接下来利用快慢指针,slow走一步,fast走两步,在fast不为null以及.next不为空的情况下,若能找到fast=slow的相遇点则链表中有环。

代码:

 public boolean hasCycle(ListNode head) {
        if(head==null){
            return false;
        }
        if(head.next==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;
    }

问题2:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
在这里插入图片描述

方法:首先判断链表是否为空,以及是否只有一个结点。接下来:
1.先利用快慢指针,slow走一步,fast走两步,在fast不为null以及.next不为空的情况下,找到fast=slow的相遇点,由于fast走的是2的倍数,因此相遇点路程一定是偶数。
2.然后将slow放回head处,slow走一步,fast走一步(由于是环形链表,fast一直在圈里),入口点刚好是快路程的二分之一处,也是slow和fast相等的地方。由于相遇点路程为偶数,而Y为尾结点与前面数相连,则在偶数的基础上+1,因此入口点一定是slow与fast相等的点,不会出现偶数个的情况。
在这里插入图片描述
代码:

 public ListNode detectCycle(ListNode head) {
        if(head==null||head.next==null){
            return null;
        }
        ListNode slow=head;
        ListNode fast=head;
        while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
            if(fast==slow){
                slow=head;
                while(slow!=fast){
                    slow=slow.next;
                    fast=fast.next;
                }
                return fast;
            }
        }
       return null;
  }

相关链接:
利用快慢指针找中点:JAVA——快慢指针解决链表相关问题(一)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值