劍指offer之面試題23 鍊錶中環的入口節點

2021-10-04 23:20:45 字數 1092 閱讀 9532

1、題目

如果個鍊錶中包含環,如何找出環的入口節點?

輸入引數:乙個鍊錶的頭指標phead

輸出結果:鍊錶中環的入口節點,或者是空指標

2、解題

這道題的關鍵在於鍊錶中環的判斷,以及在環存在前提下入口節點的找法

首先,如何判斷鍊錶中存在乙個環?

​ 定義快慢指標,快指標每次走兩步,慢指標每次走一步,若快指標出現走到了鍊錶的末尾nullptr的情況,則說 明煉表中不存在環,否則一定會在某個時刻與慢指標重合(可能遍歷兩次環)。

其次,若煉表中有環,如何找到環的入口?

​ 第一步,獲取環中的節點數。因為兩個指標相遇的節點一定是在環中,則從相遇的這個節點出發,一遍繼續向 前移動一遍計數,當再次回到這個節點的時候,即可得到環中節點數目。

​ 第二步,若環中有n個節點,則指標p1先從頭節點向前移動n步,然後p2同樣從頭節點開始,兩個指標一起移 動,兩個指標相遇的地方即為入口節點。

此外,為什麼兩個指標相遇的節點一定在環中?

​ 因為快指標走得快,如果鍊錶中有環的話,那麼它一定是在環中進行遍歷,所以相遇的節點一定在環中

3、**

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;

}

4、注意

劍指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...