劍指Offer 第16題 反轉鍊錶 java

2021-09-11 07:48:59 字數 996 閱讀 9047

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

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

為了正確的反轉乙個鍊錶,需要調整鍊錶中指標的方向。為了將調整指標這個複雜的過程分析清楚,我們可以借助圖形來直觀的分析。在圖中所示的鍊錶中,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 的結點。

**:

public class offer16 	}	

public listnode reverselist(listnode head)

return prenode; }

public static void main(string args)

}

執行結果:

4

4null

劍指offer第14題 反轉鍊錶

定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 限制 0 節點個數 5000 思路 新鍵乙個虛擬前驅節點,每次讓當前節點指向我們的上乙個前驅節點。就可以實現反向整個鍊錶了。其實並不難,鍊錶題自己多畫...

劍指Offer 第24題 反轉鍊錶

第24題 反轉鍊錶 題目 輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。我的思路 建立鍊錶一般可分為頭插法和尾插法兩種方式,那麼這裡可以通過遍歷原鍊錶採用頭插法來建立新鍊錶。自己的low public class solution return head.next 優雅 public class so...

劍指offer 16 反轉鍊錶

class listnode 題目 鍊錶翻轉 解法 設立三個標誌直接進行翻轉 public class main public static listnode reverselist listnode node listnode pre null 前序結點先設定為空 listnode point n...