LeetCode 鍊錶 面試題 反轉鍊錶

2021-09-24 06:27:16 字數 1458 閱讀 7628

題目**於 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 當前結點...