判断链表有没有环以及求环的入口问题

本文介绍了一种利用快慢指针法检测链表中是否存在环,并详细解析了如何确定环的入口位置。通过具体代码实现,展示了判断链表有无环以及找到环的起点的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode142
判断链表有没有环:
思想:快慢指针法,定义两个变量,都指向链表的头结点,一个变量一次移动两个位置,一个节点一次移动一个位置
若一个链表中有环存在,那么这两个变量一定会在环中相遇,这就好比你在操场跑步,跑的快的人一定会在环形跑道中和跑的慢的相遇,只不过是时间问题

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

求环的入口:
上面只是求出了链表中环的相遇位置,但是这个位置并不是环的入口
我们设链表的开始位置到入环为m,将环设为c环入口到相遇点设为p,相遇点到环的入口设为,通过计算得到:从开始位置到环入口的位置的距离与从相遇点出发到环入口的距离是相等的
在这里插入图片描述

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head == null || head.next == null){
          return null;
        }
      ListNode fast = head;
      ListNode slow = head;
      while(fast.next != null && fast.next.next != null){
        fast = fast.next.next;
        slow = slow.next; 
        if(fast == slow){
          ListNode i = head;
          ListNode j = slow;
          while(i != j){
          i = i.next;
          j = j.next;
        }
        return j;
        }
      }
      return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值