# 从尾到头打印链表 (opens new window)

  • 难度:Easy
  • 标签:链表反转 递归

# 刷题思路

  • [x] 链表转数组
  • [x] 链表反转+遍历
  • [x] 递归

# 方法 1 链表转数组

  • 复杂度:
    • 时间 O(N). 遍历 O(N).
    • 空间 O(N^2). 倒插复杂度依次为 1~n, 即 O(n*(n-1)/2) => O(N^2)
  • 结果:
    • 执行用时:100 ms, 在所有 JavaScript 提交中击败了39.14%的用户
    • 内存消耗:38.6 MB, 在所有 JavaScript 提交中击败了38.86%的用户

var reversePrint = function(head) {
    const res = []
    while (head) {
        res.unshift(head.val)
        head = head.next
    }
    return res
};

# 方法 2 链表反转+遍历

  • 复杂度:
    • 时间 O(N). 反转 O(N) + 遍历 O(N).
    • 空间 O(1).
  • 结果:
    • 执行用时:84 ms, 在所有 JavaScript 提交中击败了85.33%的用户
    • 内存消耗:38.6 MB, 在所有 JavaScript 提交中击败了37.17%的用户
var reversePrint = function(head) {
    head = reverse(head)
    const res = []
    while (head) {
        res.push(head.val)
        head = head.next
    }
    return res
};

function reverse (head) {
    if (!head || !head.next) return head
    let [prev, curr] = [null, head]
    while (curr) {
        let next = curr.next
        curr.next = prev
        prev = curr
        curr = next
    }
    return prev
}

# 方法 3 递归打印

  • 思路: 递归都是从运行到栈最尾部,完成运算后依次弹出. 这里利用了递归的特性倒转打印,无需写反转链表的逻辑.
  • 复杂度:
    • 时间 O(N). 一次遍历.
    • 空间 O(N). 递归调用栈消耗.
  • 结果:
    • 执行用时:84 ms, 在所有 JavaScript 提交中击败了85.33%的用户
    • 内存消耗:39.5 MB, 在所有 JavaScript 提交中击败了6.41%的用户
var reversePrint = function(head) {
    const res = []
    recursion(head, res)
    return res
};

function recursion (head, arr) {
    if (!head) return head
    const res = recursion(head.next, arr)
    arr.push(head.val)
}

JS刷题记录 Leetcode-js (opens new window) 每周都会更新刷题心得或者题解, 你的点赞或 star 都将助力我产出更好内容~