206. Reverse Linked List
Leetcode
https://leetcode.com/problems/reverse-linked-list/
題目
Given the head of a singly linked list, reverse the list, and return the reversed list.
Example 1:

Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]Example 2:

Input: head = [1,2]
Output: [2,1]Example 3:
Input: head = []
Output: []解答
方法一
用三個指標 last, before, pointer 達到反轉 linked list
var reverseList = function(head) {
let pointer = head;
let before = null;
let last = null;
while(pointer !== null) {
last = before;
before = pointer;
pointer = pointer.next;
before.next = last;
}
return before;
};For example:
linked list = [1, 2, 3];
1
2
3
last, before
pointer
1
2
3
last
before
pointer
before.next = last = null
1
2
3
last = before
before
pointer
before.next = last = 1
1
2
3
last = before
before
before.next = last = 2
Runtime: 68 ms, faster than 98.19% of JavaScript online submissions for Reverse Linked List.
Memory Usage: 40.5 MB, less than 83.92% of JavaScript online submissions for Reverse Linked List.
方法二
紀錄 前一個節點(prev) 與 後一個節點(next) 以達到反轉列表的目的
範例:head = [1,2]
初始值
prev = null
next = null第一輪 -
head = 1
// 先保存下個節點
next = head.next // next = 2
// head 指向前一個節點
head.next = prev // 1 -> null
// 將 prev 移到目前節點
prev = head // prev = 1
// 將 head 移到下個節點
head = next // head = 2第二輪 -
head = 2
// 先保存下個節點
next = head.next // next = null
// head 指向前一個節點
head.next = prev // 2 -> 1
// 將 prev 移到目前節點
prev = head // prev = 2
// 將 head 移到下個節點
head = next // head = null做完兩輪後,會發現 head 已經到終點了,而整個反轉列表的開頭就是 prev
prev = 2 -> 1 -> nullvar reverseList = function (head) {
let prev = null;
let next = null;
while (head) {
next = head.next;
head.next = prev;
prev = head;
head = next;
}
return prev;
};方法三
按照方法二的思路,但只是改成遞迴 recursion 的方式
var reverseList = function (head, prev = null, next = null) {
if (head) {
next = head.next;
head.next = prev;
prev = head;
head = next;
return reverseList(head, prev, next);
}
return prev;
};參考資料
Last updated
Was this helpful?