題目:乙個鍊錶中包含環,如何找出環的入口結點?
例如,下圖所示的鍊錶中,環的入口結點就是結點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,乙...