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

来源:互联网 发布:网络推广员是做什么的 编辑:程序博客网 时间:2024/06/07 15:40

分析:在此题中,我们定义两个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;
    }
}

阅读全文
0 0
原创粉丝点击