学算法刷LeetCode【剑指offer专题】:06. 从尾到头打印链表

434 阅读1分钟

题目描述

image.png

思路

思路一

遍历

遍历节点,将链表的值存到数组里面,这里有两种方法:

  • 存的时候就从数组的头部插入(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)

总结

思路就是遍历加反转,至于是用多余的数组还是用递归,看个人喜好吧。