链表中环的入口结点

本文介绍了一种使用双指针法查找链表中环的入口节点的方法。通过定义两个指针P1和P2,先让P1移动到环内,再同步移动两个指针直到相遇,即找到环的入口。

题目描述

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

解题思路

可以用两个指针来解决这个问题。先定义两个指针 P1 和 P2 指向链表的头结点。如果链表中环有 n 个结点,指针 P1 在链表上向前移动 n 步,然后两个指针以相同的速度向前移动。当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。

public ListNode EntryNodeOfLoop(ListNode pHead)      
    {
        if(pHead==null)
            return null;
        ListNode node=MeetingNode(pHead);
        if(node==null)
            return null;
        ListNode temp=node.next;
        int n=1;
        while(temp!=node){
            n++;
            temp=temp.next;
        }
        ListNode p=pHead;
        ListNode q=pHead;
        for(int i=0;i<n;i++){
                q=q.next;
        }
        while(p!=q){
            p=p.next;
            q=q.next;
        }
        return p;       
    }
    private ListNode MeetingNode(ListNode pHead){
        if(pHead==null)
            return null;
        ListNode pSlow=pHead.next;
        if(pSlow==null)
            return null;
        ListNode pFast=pSlow.next;
        while(pFast!=null&&pSlow!=null){
            if(pFast==pSlow)
                return pFast;
            pSlow=pSlow.next;
            pFast=pFast.next;
            if(pFast!=null)
                pFast=pFast.next;
        }
        return null;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值