LeetCode演算法題
題目:反轉連結串列
- 方法一:迭代
假設存在連結串列 1 \rightarrow 2 \rightarrow 3 \rightarrow \varnothing1→2→3→∅,我們想要把它改成 \varnothing \leftarrow 1 \leftarrow 2 \leftarrow 3∅←1←2←3。
在遍歷列表時,將當前節點的 \textit{next}next 指標改為指向前一個元素。由於節點沒有引用其上一個節點,因此必須事先儲存其前一個元素。在更改引用之前,還需要另一個指標來儲存下一個節點。不要忘記在最後返回新的頭引用!
Java
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
}
複雜度分析
時間複雜度:O(n)O(n),假設 nn 是列表的長度,時間複雜度是 O(n)O(n)。
空間複雜度:O(1)O(1)。
- 方法二:遞迴
遞迴版本稍微複雜一些,其關鍵在於反向工作。假設列表的其餘部分已經被反轉,現在我們應該如何反轉它前面的部分?
假設列表為:
n_{1}\rightarrow \ldots \rightarrow n_{k-1} \rightarrow n_{k} \rightarrow n_{k+1} \rightarrow \ldots \rightarrow n_{m} \rightarrow \varnothing
n
1
→…→n
k−1
→n
k
→n
k+1
→…→n
m
→∅
若從節點 n_{k+1}n
k+1
到 n_{m}n
m
已經被反轉,而我們正處於 n_{k}n
k
。
n_{1}\rightarrow \ldots \rightarrow n_{k-1} \rightarrow n_{k} \rightarrow n_{k+1} \leftarrow \ldots \leftarrow n_{m}
n
1
→…→n
k−1
→n
k
→n
k+1
←…←n
m
我們希望 n_{k+1}n
k+1
的下一個節點指向 n_{k}n
k
。
所以,n_k.\textit{next}.\textit{next} = n_{k}n
k
.next.next=n
k
。
要小心的是 n_{1}n
1
的下一個必須指向 \varnothing∅ 。如果你忽略了這一點,你的連結串列中可能會產生迴圈。如果使用大小為 22 的連結串列測試程式碼,則可能會捕獲此錯誤。
Java
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode p = reverseList(head.next);
head.next.next = head;
head.next = null;
return p;
}
}
複雜度分析
時間複雜度:O(n)O(n),假設 nn 是列表的長度,那麼時間複雜度為 O(n)O(n)。
空間複雜度:O(n)O(n),由於使用遞迴,將會使用隱式棧空間。遞迴深度可能會達到 nn 層。
作者:LeetCode
連結:https://leetcode-cn.com/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-by-leetcode/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
相關文章
- leetcode排序專題演算法刷題LeetCode排序演算法
- KMP演算法(Leetcode第28題)KMP演算法LeetCode
- LeetCode演算法題解:LFU CacheLeetCode演算法
- Leetcode 演算法題解系列 - 最小棧LeetCode演算法
- 每週刷個 leetcode 演算法題LeetCode演算法
- leetcode演算法熱題--兩樹之和LeetCode演算法
- LeetCode簡單演算法題目-JS解法LeetCode演算法JS
- leetcode刷題記錄:演算法(三)滑動視窗演算法LeetCode演算法
- LeetCode演算法簡單題--JavaScript(每天一道題)LeetCode演算法JavaScript
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- Leetcode 題解演算法之動態規劃LeetCode演算法動態規劃
- LeetCode解題記錄(貪心演算法)(二)LeetCode演算法
- LeetCode解題記錄(貪心演算法)(一)LeetCode演算法
- LeetCode演算法題-Number of Boomerangs(Java實現)LeetCode演算法OOMJava
- LeetCode 演算法題系列(第一週 25道)LeetCode演算法
- 演算法刷題:LeetCode中常見的動態規劃題目演算法LeetCode動態規劃
- 簡單演算法題:leetcode-1 兩數之和演算法LeetCode
- 簡單演算法題:leetcode-2 兩數相加演算法LeetCode
- vscode的LeetCode演算法刷題外掛VSCodeLeetCode演算法
- 還欠自己一整套LeetCode 演算法題LeetCode演算法
- leetcode.回溯演算法能解決什麼問題?LeetCode演算法
- leetcode刷題記錄:演算法(六)BFS&DFSLeetCode演算法
- leetcode演算法題解(Java版)-14-第k小數問題LeetCode演算法Java
- LeetCode演算法題-Next Greater Element I(Java實現)LeetCode演算法Java
- 【完虐演算法】LeetCode 接雨水問題,全覆盤演算法LeetCode
- LeetCode高頻演算法面試題 - 002 - 兩數相加LeetCode演算法面試題
- leetcode演算法題解(Java版)-3-廣搜+HashMapLeetCode演算法JavaHashMap
- leetcode演算法資料結構題解---資料結構LeetCode演算法資料結構
- leetcode演算法題解(Java版)-12-中序遍歷LeetCode演算法Java
- leetcode演算法題解(Java版)-16-動態規劃(單詞包含問題)LeetCode演算法Java動態規劃
- 前端面試必備-40道LeetCode經典面試演算法題前端面試LeetCode演算法
- LeetCode通關:連刷十四題,回溯演算法完全攻略LeetCode演算法
- leetcode演算法題解(Java版)-7-迴圈連結串列LeetCode演算法Java
- 【LeetCode回溯演算法#08】遞增子序列,鞏固回溯演算法中的去重問題LeetCode演算法
- 【LeetCode回溯演算法#07】子集問題I+II,鞏固解題模板並詳解回溯演算法中的去重問題LeetCode演算法
- LeetCode問題LeetCode
- LeetCode 上最難的連結串列演算法題,沒有之一!LeetCode演算法
- Leetcode 演算法題解系列 - 二叉樹的層序遍歷LeetCode演算法二叉樹