LeetCode206——反轉鏈表

題目描述

反轉一個單鏈表。

示例:
輸入: 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時開始反轉,此時 list3->nullhead 爲 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),因爲使用了遞歸

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章