經典演算法 鍊錶中環的入口結點

2021-07-11 09:23:49 字數 1520 閱讀 9464

題目:乙個鍊錶中包含環,如何找出環的入口結點?

例如,下圖所示的鍊錶中,環的入口結點就是結點3

完整測試程式:

#include using namespace std;

struct listnode

;//利用一快一慢兩個指標,快指標速度是慢指標的兩倍,找到兩個指標在環中的相遇點

listnode* meetingnode(listnode* phead)

}return null;

}listnode* entrynodeofloop(listnode* phead)

// 結點指標pnode1先走nodesinloop步

pnode1 = phead;

for (int i = 0; i < nodesinloop; ++i)

pnode1 = pnode1->next;

// 結點指標pnode1 和pnode2以相同的速度一起走

listnode* pnode2 = phead;

while (pnode1 != pnode2)

return pnode1;

}listnode* createlistnode(int value)

void destroylist(listnode* phead)

}void connectlistnodes(listnode* pcurrent, listnode* pnext)

pcurrent->next = pnext;

}int main()

{ listnode* pnode1 = createlistnode(1);

listnode* pnode2 = createlistnode(2);

listnode* pnode3 = createlistnode(3);

listnode* pnode4 = createlistnode(4);

listnode* pnode5 = createlistnode(5);

connectlistnodes(pnode1, pnode2);

connectlistnodes(pnode2, pnode3);

connectlistnodes(pnode3, pnode4);

connectlistnodes(pnode4, pnode5);

connectlistnodes(pnode5, pnode3);

listnode* res = entrynodeofloop(pnode1);

cout << "鍊錶中環的入口結點是:"

演算法 鍊錶中環的入口結點

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。這個題目很經典 但是這種快慢指標的想法的原因我還沒有明白其中的由來 還有不明白為什麼快指標只能走2步,或者又是什麼道理,沒懂 但是清楚的明白一點就是,快慢指標相遇的點一定是在環內,那麼根據這個點在環內轉圈再次遇到即就能得到環的大小n,也就是環中結點的個數...

鍊錶中環的入口結點

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。class listnode public class solution return p1 return null 分析 假設鍊錶的起始點到環的入口點節點數為k,環的的節點數為x,讓p2的速度是p1的兩倍,p1和p2相遇在環的第y各節點,可以得到如下等...

鍊錶中環的入口結點

題目要求 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點 分析 1 一種比較偷懶的方法就是遍歷鍊錶,並直接利用hashmap來儲存已經遍歷過的結點。一旦發現已經儲存過的結點,那麼該結點就是環的入口結點。2 參考自 我簡單畫了乙個圖 上傳之後一直是橫過來的。不知道為什麼轉不正 設定兩個指標p1和p2,乙...