題目:給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出null。
思路:首先,判斷鏈表是否有環,即採用兩個快慢指針,若相遇,有環。不然直接返回null。然後,尋找入環結點。根據環中結點的個數,使快指針先走這個數,然後依次移動,最終的相遇點,即爲入環結點。
PS:關於求環中結點個數。前期快慢指針相遇後,證明有環。則定義一個計數器,保證一個結點不動,依次移動另一個,直到兩個結點再次相遇,此時計數器即爲環中結點個數。
public static ListNode EntryNodeOfLoop(ListNode pHead) {
if(pHead==null)
return null;
ListNode pNode = new ListNode(0);
ListNode pNode1 = new ListNode(0);
ListNode pNode2 = new ListNode(0);
ListNode pNode3 = new ListNode(0);
pNode = pHead;
pNode1 = pHead;
pNode2 = pHead;
pNode3 = pHead;
boolean flag = false;
while(pNode3!=null) {
pNode3 = pNode3.next;
if(pNode3!=null)
pNode3 = pNode3.next;
if(pNode3==pNode) {
flag = true;
break;
}
pNode = pNode.next;
}
if(flag) {
pNode3 = pNode3.next;
int num = 1;
while(pNode3!=pNode) {
pNode3 = pNode3.next;
num++;
}
while(num!=0) {
pNode1 = pNode1.next;
num--;
}
while(pNode1!=pNode2) {
pNode1 = pNode1.next;
pNode2 = pNode2.next;
}
return pNode2;
}
else {
return null;
}
}
希望看到我代碼的各位看官,多多吐槽,我也想簡潔,可是實力不允許啊!!(淚目~)