劍指Offer面試題16(Java版) 反轉鍊錶

2021-07-04 06:32:52 字數 1161 閱讀 8429

題目:定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。

解決與鍊錶相關的問題總是有大量的指標操作,而指標操作的**總是容易出錯的。很多的面試官喜歡出鍊錶相關的問題,就是想通過指標操作來考察應聘者的編碼功底。為了避免出錯,我們最好先進行全面的分析。在實際軟體開發周期中,設計的時間通常不會比編碼的時間短。在面試的時候我們不要急於動手寫**,而是一開始仔細分析和涉及,這將會給面試官留下好的印象。與其給出一段漏洞百出的**,倒不如仔細分析再寫出魯棒性好的**。

為了正確的反轉乙個鍊錶,需要調整鍊錶中指標的方向。為了將調整指標這個複雜的過程分析清楚,我們可以借助圖形來直觀的分析。在圖中所示的鍊錶中,h,i,j是3個相鄰的結點。假設經過若干的操作,我們已經把結點h之前的指標調整完畢,這些結點的m_pnext都指向前面的乙個結點。接下來我們把i的m_pnext指向h,此時的鍊錶結構如圖b所示。

不難注意到,由於結點i的m_pnext指向了它的前乙個結點,導致我們無法在鍊錶中遍歷到結點j。為了避免鍊錶在結點i處斷開,我們需要在調整結點i的m_pnext之前,把結點j儲存下來。

也就是說我們在調整結點i的m_pnext指標時,除了需要知道結點i本身之外,還需要i的前乙個結點h,因為我們需要把結點i的m_pnext指向結點h,同時,我們還實現需要儲存i個結點j,以防止鍊錶斷開。因此相應地我們需要三個指標,分別指向當前遍歷到的結點,它的前乙個結點和後乙個結點。

最後我們試著找到反轉鍊錶的頭結點。不難分析出反轉後的鍊錶的頭結點是原始鍊錶的尾節點。什麼結點是尾節點,自然是m_pnext為 null 的結點。

分析寫出下面的**:

/**

* 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後的頭結點。

*/package swordforoffer;

import utils.listnode;

/** * @author jinshuangqi

* * 2023年8月1日

*/public class e16reverselist

return prelistnode;

} public static void main(string args)

}

劍指offer 面試題16

include 思路 遍歷鍊錶過程中,將各個指標入棧,再出棧進行反轉 listnode reverselist listnode phead pnode pnodestack.top listnode pfront pnode pnodestack.pop while pnodestack.empt...

劍指offer 面試題16 反轉鍊錶

題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。hint 請務必使用鍊錶 輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 0 n 1000 代表將要輸入的鍊錶的個數。輸入的第二行包含n個整數t 0 t 1000000 代表鍊錶元素。輸出 對應每個...

劍指Offer面試題16 反轉鍊錶

反轉鍊錶 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出翻轉後鍊錶的頭結點。分析 假設h,i,j三個節點。h節點已經指向前面的節點,i節點要指向h節點,這時,i與j中間斷開,因此在將i節點指向 h節點之前,先記下j節點。因此調整時 需要知道當前節點以及當前節點前面乙個節點,以及當前節點後面乙個...