8 找出鍊錶環的入口結點

2021-09-10 08:55:08 字數 1892 閱讀 6395

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。

/*

struct listnode

};*/

class solution

};

鍊錶中有環的解釋:參考:

上圖中的第二個示例圖p2改為p1。

環中結點的數目

1)判斷乙個煉表裡是否有環時用到了一快一慢兩個指標,如果兩個指標相遇,表明鍊錶中存在環。兩個指標相遇的結點一定在環中,2)從這個結點出發,一邊繼續向前移動一位一遍計數,當再次回到這個結點時,就可以得到環中的節點數。

解法1:

class solution 

slow=slow->next;

fast=fast->next;

if(fast!=slow)

}return null;

}public:

listnode* entrynodeofloop(listnode* phead)

// 移動p1

p1=phead;

for(int i=0;inext;

}// 移動p1,p2

listnode* p2=phead;

while(p1!=p2)

return p1;}};

解法2:出錯!

class solution 

return nullptr;

}};// 故上述的這種情況只滿足:環中有結點個數為2的情況

測試結果:

您提交的程式沒有通過所有的測試用例

case通過率為50.00%

原因是事前不知道環結點有幾個,就pfast走到了第二個指標。

解法:3:其它的思路

//先說個定理:兩個指標乙個fast、乙個slow同時從乙個鍊錶的頭部出發

//fast一次走2步,slow一次走一步,如果該鍊錶有環,兩個指標必然在環內相遇

//此時只需要把其中的乙個指標重新指向鍊錶頭部,另乙個不變(還在環內),

//這次兩個指標一次走一步,相遇的地方就是入口節點。

//

class solution 

else

}//跳出上述迴圈,則有環,此時fast=slow.

fast=phead;//重新定義fast結點的位置為頭結點

while(fast!=slow)

return slow;}};

通過!

但是沒有像之前說的要找出結點的個數!

類似解法:

//左神講的

//先說個定理:兩個指標乙個fast、乙個slow同時從乙個鍊錶的頭部出發

//fast一次走2步,slow一次走一步,如果該鍊錶有環,兩個指標必然在環內相遇

//此時只需要把其中的乙個指標重新指向鍊錶頭部,另乙個不變(還在環內),

//這次兩個指標一次走一步,相遇的地方就是入口節點。

//這個定理可以自己去網上看看證明。

//class solution

if(fast == null || fast->next == null)

return null;

fast=phead;

while(fast!=slow)

return fast;}};

參考:

思路2的定理  待續

鍊錶(找出環的入口)

題目 找出鍊錶中環的開始位置 題解 使用快慢指標,當快指標不為空時,快指標走兩步,慢指標走一步 判斷是否相遇 相遇的話,讓快指標從頭再和慢指標一塊走,直到相遇 鍊錶中環的入口 給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。public listnode entrynode...

找出鍊錶環的入口

問題 給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。分析 快慢指標 公式推導 code public class listnode public listnode entrynodeofloop2 listnode phead else 沒找到環 if fast null...

鍊錶環的入口結點

如果乙個鍊錶包含環,如何找出環的入口結點?單鏈表只有乙個指標域,所以環的話一定是後半部分成環或者是一整個。關於這種鍊錶問題,一般都是可以用雙指標來解決。首先考慮特殊情況,不是環 雙指標 鍊錶為none。1.通過pre和latter兩個指標,同時走,pre的速度是latter的兩倍,如果pre小於等於...