题目如下:
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2] 输出:[2,3,1]
第一次尝试:
思路:建立一个新的数组,每读取一个元素就向数组第一位添加一个元素。
注意:记得让指针移动。
代码如下:
/**
* 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 = [];
while(head != null){
stack.unshift(head.val);
head = head.next;
};
return stack;
};
好的解法:
利用递归:
思路:
既然想到了用栈,而递归本质上就是一个栈结构,要实现反过来输出链表,每访问到一个节点的时候,先递归输出它后面的节点,再输出该节点自身,这样链表的输出结果就反过来了。
代码如下:
/**
* @param {ListNode} head
* @return {number[]}
*/
var reversePrint = function(head, arr = []) {
// 利用函数递归栈的特性
if (head != null) {
if (head.next != null) {
reversePrint(head.next, arr);
}
arr.push(head.val);
}
return arr;
};