劍指offer 反轉鍊錶

2021-08-17 12:24:17 字數 1008 閱讀 9006

struct listnode 

};

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

為了正確的反轉乙個鍊錶,需要調整鍊錶中指標的方向。為了將調整指標的這個複雜過程分析清楚,我們可以借助畫圖來直觀的分析,具體圖如下:

反轉前:所示的鍊錶 h、i、j 是三個相鄰的結點。

反轉中:經過若干操作,我們已經把結點 h 之前的指標調整完畢,這些節點的next都指向前面乙個結點。

我們可以看到,上圖所示的鍊錶 i 結點的next指向 h ,此時的鍊錶結構為結點 i 和 j 之間發生斷裂。

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

也就是說我們在調整結點 i 的next指標時,除了需要知道結點 i 本身,還要知道結點 i 的前乙個結點 h ,因為我們需要把結點 i 的next指向結點 h 。同時,我們還需要儲存 i 的下乙個節點 j ,以防止鍊錶斷裂。

為此,我們需要定義三個指標,分別指向當前遍歷的結點、它的前乙個結點、它的後乙個結點。

最後我們試著找到反轉鍊錶的頭結點。不難分析出,反轉之後的鍊錶的頭結點為原始鍊錶的尾節點。

為此,我們給出**如下:

listnode* reverselist(listnode* phead) 

return reversephead;

}

劍指offer 反轉鍊錶

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。方法1 將單鏈表儲存為陣列,然後按照陣列的索引逆序進行反轉。方法2 使用三個指標遍歷單鏈表,逐個鏈結點進行反轉。方法3 從第2個節點到第n個節點,依次逐節點插入到第1個節點 head節點 之後,最後將第乙個節點挪到新錶的表尾。public class l...

劍指offer 反轉鍊錶

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。1.非遞迴 struct listnode class solution listnode ppre null listnode p phead listnode pnext null while p null else p pnext return p...

《劍指offer》 反轉鍊錶

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。之前錯誤的寫法,一直不明白 原因是移位的時候,pcurr移到下一位時,裡面的值已經變成反向指標了,所以不能成功移動,就迴圈巢狀進去了,所以還需要乙個變數pnext來儲存移位前的值。struct listnode class solution phead ...