題目**於 leetcode 上第 206號(reverse linked list)問題:反轉乙個單鏈表。題目難度為 easy。
題目描述
reverse a singly linked list.
反轉乙個單鏈表
input: 1->2->3->4->5->null
output: 5->4->3->2->1->null
複製**
解法一: 遞迴
尋找遞迴結束條件:當鍊表只有乙個節點,或者如果是空表的話,結束遞迴
head == null || head.next == null
複製**
呼叫函式本身,傳入下乙個節點
reverselist(head.next);
複製**
我們把 2->3->4->5 遞迴成了 5->4->3->2, 對於1節點沒有去更改,所以1的next節點指向的是2,如下所示
遞迴前:
1 -> 2 -> 3 -> 4 -> 5
遞迴後:
1 -> 2 <- 3 <- 4 <- 5|v
null
複製**
最後將節點 2 的 next 指向 1,然後把 1 的 next 指向 null,如下所示
null <- 1 <- 2 <- 3 <- 4 <- 5
複製**
演算法效率如下圖所示:
**實現
class solution
}複製**
解法二: 原地逆置鍊錶
設定三個節點 prenode, head, next
判斷head 以及 head.next 是否為空,如果為空,結束迴圈
如果不為空,設定臨時變數next為head的下乙個節點
head的下乙個節點指向prenode,然後prenode移動到head, head移動到next
重複(1)(2)(3)
演算法效率如下圖所示:
**實現
class solution
return prenode;
}}複製**
新建乙個新鍊錶, 新鍊錶的頭結點 newhead
迴圈判斷head是否為空,為空時結束迴圈
如果不為空,依次取原鍊錶中的每乙個節點,作為第乙個節點插入到新鍊錶中
演算法效率如下圖所示:
**實現
class solution
return newhead.next;
}}複製**
【leetcode-棧】有效的括號
【leetcode-鍊錶】面試題-反轉鍊錶
【leetcode-二叉樹】二叉樹前序遍歷
【leetcode-陣列】陣列式整數加法
鏈表面試題 反轉單鏈表
反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null解決方案 頭插法開闢新鍊錶並逐個讀取舊鍊錶,頭插進新鍊錶,這樣新的鍊錶與原鍊錶的結構就是反的,需要借助輔助空間 definition for singly linked list.struct listnod...
面試題 反轉鍊錶
定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點。鍊錶節點定義如下 struct listnode int m nkey listnode m pnext 思路 額,一路遍歷下去,前後指向反過來,最後乙個節點就輸出。o n 的效率也應該是最優的了。答案如下 listnode r...
面試題 反轉鍊錶
面試題 反轉鍊錶 思路 要實現鍊錶反轉,需要調整鍊錶中指標方向,使鍊錶反轉後的頭結點為原鍊錶的尾結點。為了防止結點斷裂,需定義三個指標,分別指向當前遍歷的結點,它的前一結點以及後乙個結點。當然編寫 時要考慮到下列三點 防止程式崩潰 將思路用 實現為 slistnode node phead 當前結點...