1、題目
如果個鍊錶中包含環,如何找出環的入口節點?
輸入引數:乙個鍊錶的頭指標phead
輸出結果:鍊錶中環的入口節點,或者是空指標
2、解題
這道題的關鍵在於鍊錶中環的判斷,以及在環存在前提下入口節點的找法
首先,如何判斷鍊錶中存在乙個環?
定義快慢指標,快指標每次走兩步,慢指標每次走一步,若快指標出現走到了鍊錶的末尾nullptr的情況,則說 明煉表中不存在環,否則一定會在某個時刻與慢指標重合(可能遍歷兩次環)。
其次,若煉表中有環,如何找到環的入口?
第一步,獲取環中的節點數。因為兩個指標相遇的節點一定是在環中,則從相遇的這個節點出發,一遍繼續向 前移動一遍計數,當再次回到這個節點的時候,即可得到環中節點數目。
第二步,若環中有n個節點,則指標p1先從頭節點向前移動n步,然後p2同樣從頭節點開始,兩個指標一起移 動,兩個指標相遇的地方即為入口節點。
此外,為什麼兩個指標相遇的節點一定在環中?
因為快指標走得快,如果鍊錶中有環的話,那麼它一定是在環中進行遍歷,所以相遇的節點一定在環中
3、**
4、注意listnode*
meetingnode
(listnode* phead)
return nullptr;
}listnode*
entrynodeofloop
(listnode* phead)
pnode1 = phead;
//快指標先走
for(
int i =
0; i < nodesinloop; i++
) pnode1 = pnode1->m_pnext;
listnode* pnode2 = phead;
//快慢一起走
while
(pnode1 != pnode2)
return pnode1;
}
劍指offer之面試題16 反轉鍊錶
題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。思路 借助圖形來分析一下反轉鍊錶需要改變哪些指標。假設某一時刻,經過若干操作,我們已經把h點之前的指標調整完畢,現在反轉i指標指向的結點。由圖可知,為了防止指標的斷開,需要儲存i的next指標,為了完成反轉,需要知道i的前乙個指標prev,當然...
劍指Offer之面試題23 從上往下列印二叉樹
所有 均通過g 編譯器 測試,僅為練手紀錄。面試題 23 從上往下列印二叉樹 題目 從上往下列印出二叉樹的每個結點,同一層的結點按照從左到右的順序列印。面試題23 從上往下列印二叉樹 題目 從上往下列印出二叉樹的每個結點,同一層的結點按照從左到右的順序列印。void treeprintbreadth...
劍指Offer之面試題26 複雜鍊錶的複製
所有 均通過g 編譯器 測試,僅為練手紀錄。面試題 26 複雜鍊錶的複製 題目 請實現函式 complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個 m pnext 指標指向下乙個結點外,還有乙個 m psibling...