1. 程式人生 > >鏈表中環的入口

鏈表中環的入口

listnode 得到 urn null ++ 指針 span 有環 style

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead)//求環入口,先找到環的長度,再讓一個指針走環長度步,再讓另一個指針之後開始走,兩者相遇的地方就是環入口
    {
        ListNode meetingNode=MeetingNode(pHead);
        
if(meetingNode==null) return null; //得到環中節點的數目 int nodesInLoop=1; ListNode pNode1=meetingNode; while(pNode1.next!=meetingNode) { pNode1=pNode1.next; ++nodesInLoop; } //先移動pNode1,次數為環中節點的數目 pNode1=pHead;
for(int i=0;i<nodesInLoop;++i) pNode1=pNode1.next; ListNode pNode2=pHead; while(pNode1!=pNode2){ pNode1=pNode1.next; pNode2=pNode2.next; } return pNode1; } 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; } }

鏈表中環的入口