反轉鍊錶是常見題。最基本的就是給乙個鍊錶,然後反轉。如果稍微帶點花樣的話,leetcode上有一些題,比如reverse linked list ii,是叫你反轉在一定範圍內的nodes,比如從第二個node開始到第四個node結束,反轉之間的子鍊錶;再有比如reverse nodes in k-group,是叫你每個長度為k的子鍊錶反轉。反轉鍊錶的題並沒有什麼高深的演算法,考驗的基本上就是純粹的程式設計基礎,鍊錶操作。到底如何優雅地反轉乙個鍊錶呢?方法可能有不止一種,這裡提供一種筆者覺得比較易懂的方法。先上**:
struct listnode
};listnode *reverse(listnode *head)
return dummy.next;
}
看到這裡儲存了幾個指標:
舉個例子:比如我們有乙個鍊錶1---2---3,我們現在需要翻轉整個鍊錶。首先來乙個fake head,鍊錶變成了#---1---2---3,那麼prem就一直指向#這個node不變;而pre永遠指向1這個node不變;head一開始指向的是2。接著,把head所指向的這個node放在prem後面,鍊錶變成了#---2---1---3,然後讓head回到pre後面。於是這個時候,三個指標分別指向的是:prem: #; pre: 1; head: 3。而鍊錶變成了: #---2---1---3。下一步鍊錶變成了:#---3---2---1,翻轉完成。
如何反轉乙個鍊錶
最近在刷leetcode中關於鍊錶的題,發現很多題都涉及到了了鍊錶的反轉 給出乙個鍊錶 1,2,3,4,5 反轉為 5,4,3,2,1 解決該問題可以用迴圈解決,而核心思想便是在迴圈中每次只讓第i個元素插入到鍊錶的頭部 在迴圈之前鍊錶長這樣 1 2 3 4 5第一次迴圈 2 1 3 4 5第二次迴圈...
反轉乙個鍊錶
反轉乙個單鏈表 題目源於領扣 示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 高階 你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題 題目分析 因為乙個單個鍊錶結點有前驅和後繼,所以我們不能像順序表那樣直接交換元素。我們需要三個指標prev,cur,next來完整...
206 反轉鍊錶 反轉乙個單鏈表。
題解一 迭代法 在遍歷鍊錶時,將當前節點的 next 指標改為指向前乙個節點。由於節點沒有引用其前乙個節點,因此必須事先儲存其前乙個節點pre。在更改引用之前,還需要儲存後乙個節點。最後返回新的頭引用。definition for singly linked list.struct listnode...