题目描述
思路
思路一
遍历
遍历节点,将链表的值存到数组里面,这里有两种方法:
-
存的时候就从数组的头部插入(
unshift()),这样直接返回该数组即可。(见解法1) -
增加一个新的数组2,遍历链表的时候按原顺序存入数组1中,然后再反向遍历一次数组1,将结果存入数组2中,返回数组2的结果。(见解法2)
解法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 res = [];
while(head){
res.unshift(head.val);
head = head.next;
}
return res;
}
解法2
var reversePrint = function(head) {
let arr1 = [];
let arr2 = [];
while(head){
arr1.push(head.val);
head = head.next;
}
for(let i = arr1.length - 1; i <= 0; i--){
arr2.push(arr1[i]);
}
return arr2;
}
以上两种解法:
时间复杂度为 O(n)
空间复杂度为: O(n)
思路二
递归
var reversePrint = function(head) {
let res = [];
var reverse = (head) => {
if(!head) return;
reverse(head.next);
res.push(head.val);
}
reverse(head);
return res;
};
递归的时间复杂度为:递归的次数*每次递归中的操作次数,这里递归次数为 n, 操作数为 1,所以:
时间复杂度为 O(n)
空间复杂度为: O(n)
总结
思路就是遍历加反转,至于是用多余的数组还是用递归,看个人喜好吧。