# 题目描述

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

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

限制: 0 <= 链表长度 <= 10000

# 解题方案

栈的特点是先进后出,因为题目要求从尾到头打印元素,所以符合栈的特性

  • 先遍历一遍链表,将链表中的元素存入到栈中
  • 再不断弹出栈内元素,将弹出元素存放到结果数组中
  • 也有使用递归来进行解题的,在此提出一个思考,递归和栈的关系是什么?其实递归的本质也是在使用栈,只不过是程序调用栈,因为没有显式在代码中体现出来,所以常常被忽略了
  • 时间复杂度:O(n)O(n),空间复杂度:O(n)O(n)

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {number[]}
 */
var reversePrint = function(head) {
  // 创建辅助栈
  let stack = [];
  // 头结点赋值,
  let pointer = head;
  // 指针移动
  while (pointer != null) {
    stack.push(pointer.val);
    pointer = pointer.next;
  }
  
  const length = stack.length;
  let res = [];

  for (let i = 0; i < length; i++) {
    res.push(stack.pop());
  }
  return res;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
最后更新时间: 12/30/2021, 10:04:44 AM