文章

剑指offer-6-从尾到头打印链表📌

Algorithm

剑指offer-6-从尾到头打印链表📌

剑指offer-6-从尾到头打印链表📌

剑指 Offer 06. 从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:

输入:head = [1,3,2]
输出:[2,3,1]

限制:

0 <= 链表长度 <= 10000

解题思路

// 常规解法: 使用栈空间来辅助
 
function reversePrint(head: ListNode | null): number[] {
  let newArr = [];
  while (head) {
    newArr.unshift(head.val);
    head = head.next;
  }
  return newArr;
}

特殊解法:

  • 其实这种解法,有点像是统计节点个数和使用栈空间辅助相结合
    • 通过创建一个临时变量先来遍历整个链表,以此来统计链表节点的个数
    • 通过链表节点的个数来创建对应大小的栈空间,然后再从后往前依次填入元素
  • 那么,这种解法达到的效果就是其额外的空间复杂度为 O(1),相比于用栈空间辅助达到的空间复杂度 O(n)是要好许多的
// 特殊解法
 
function reversePrint(head: ListNode | null): number[] {
  if (head === null) return new Array(0);
 
  let n = 0;
  let h = head;
  while (h) {
    n++;
    h = h.next;
  }
 
  let newArr = new Array(n);
 
  while (head !== null) {
    // 从后往前
    newArr[--n] = head.val;
    head = head.next;
  }
 
  return newArr;
}

image-20230521135252783

image-20230521135313311