鏈表中環的入口
阿新 • • 發佈:2018-10-07
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; } }
鏈表中環的入口