一个链表中包含环,请找出该链表的环的入口结点。

本文介绍了一种高效检测链表中环入口节点的方法。通过快慢指针相遇后重新定位一个指针到链表头部并同步移动,最终确定环的起始位置。此方法适用于含有环形结构的链表问题。

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

分析:在此题中,我们定义两个ListNode 变量,分别为fast ,slow 。其中fast 每次向前走走两步,slow 每次向前走一步,这样如果链表中有环的时候fast 和slow 必定会在环中的某一个节点相遇。否则链表中没有环。现在假设链表中环的元素个数是n个,fast 和slow相遇在k节点上,进入环入口前链表元素一共有a个元素。假设slow 在进入环入口前,fast已经走了m圈。所以有2(a+k)=a+m*n+k其中(m为整数,fast 是slow 的两倍),于是就得到了a=m*n-k;所以我们定义一个新的节点  node让他指向链表的头结点,与此同时让node与slow一同向前一步一步的走,当他们两个相等的时候即是链表的环入口

public class Solution{


    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
    ListNode p_node=null;
        if(pHead ==null || pHead.next==null){
            return null;
        }
        ListNode fast =  pHead;
        ListNode slow = pHead;
        while(fast !=null && fast.next != null ){
            //每次向前走两步
            fast=fast.next.next;
            //每次向前走一步
            slow=slow.next;
            if(slow == fast){
            //slow与fast相遇的时候
             ListNode node=pHead;
             while(node !=slow){
                 node=node.next;
                 slow=slow.next;
             }
             return node;
            }
            
        }
        return null;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值