題目描述
反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題?
分析
反轉鏈表的關鍵在於將當前節點的 next
指向前一節點。
方法一:迭代
需要兩個變量,分別用來存儲當前節點和上一節點,並把當前節點的 next
指向上一節點,然後前進一位,直到結束。
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
var cur = head
var prev = null
while (cur) {
var next = cur.next
cur.next = prev
prev = cur
cur = next
}
return prev
};
時間複雜度O(n)
空間複雜度O(1)
方法二:遞歸
遞歸理解起來比較繞。假設有 1->2->3->null
這樣一個鏈表,當執行到3時開始反轉,此時 list
爲 3->null
,head
爲 2,此時2的狀態爲 2->3->null
,要變爲 3->2->null
則需要讓 head.next.next = head
,並且 head.next = null
,畫了個圖:
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
if (head === null || head.next === null) {
return head
}
const list = reverseList(head.next)
head.next.next = head
head.next = null
return list
}
時間複雜度O(n)
空間複雜度O(n),因爲使用了遞歸