题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
题解
解法一: 新建数组array,遍历链表,将每个元素以unshift的方式插入数组array的前端。最后返回数组array。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {number[]}
*/
var reversePrint = function(head) {
var array = [];
var p = head;
while(p != null){
array.unshift(p.val);
p = p.next;
}
return array;
};
解法二:递归
var array = [];
var reversePrint = function(head) {
if(head!=null){
if(head.next!=null){
arguments.callee(head.next);
}
array.push(head.val);
}
return array;
};
在乐扣网上提交,测试用例[]会不通过,显示还是输出[2,3,1]。因为数组array是全局变量,后面的测试用例会在前面[2,3,1]的基础上进行修改。如果将array写在函数体内,每次递归将重新定义一次,最终只能输出最后一个元素[1]。
对于递归方法来说,当链表非常长的时候,会导致函数调用层级很深,从而导致函数调用栈溢出。
用栈基于循环实现的方式鲁棒性更好。
知识点总结
js中关于数组的常用方法:
-
栈方法
push():接收参数,将其添加至数组末尾,返回修改后的数组长度
pop():从数据末尾移出一项,并返回删除的项
-
队列方法
shift():移出数组的第一项,并返回该项
unshift():接收参数,将其插入数组前端,返回修改后的数组长度
-
排序方法
reverse():反转数组项的顺序,无返回值,直接修改数组
sort():按字符形式比较元素,升序排列