leetcode——从尾到头打印链表

144 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

前言

力扣练习第三天,拒绝思路老化。今天要练习的是从尾到头打印链表

题目信息如下:

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

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} head
 * @return {number[]}
 */
 
/**
 * head: [1,3,2]
 * return [2,3,1]
 */

解法一

其实这道题,没有那么多花花绕,反转一个链表,无非就那几种常用的方法。一种是深度遍历,一直找到最后一个节点,然后一层一层往上走,每回退一层,将该层的值存入数组中,直至第一层。此时,数组中的值就是链表反转之后的结果。

var reversePrint = function(head) {
    const result = [];
    function dfs(node) {
        if (node === null) return;
        dfs(node.next);
        result.push(node.val);
    };
    dfs(head);
    return result;
};

解法二

第二种方法,比较巧妙。大家都知道,栈的特点就是后进先出(LIFO)。那根据这个特点呢我们就可以轻松的实现一些反转操作。就拿本题来说,我们只需对链表遍历一次,在便利途中我们将当前节点的值入栈。等一次遍历结束,当前栈就是我们需要的结果。

// 为了方便起见,我们用Array结构来模拟栈。从头部进入与退出。
// 所以,我们使用数组API: unshift, 由于本题不牵扯退栈操作,所以不考虑退栈API
// 退栈也简单,shift 就可以满足我们的要求

var reversePrint = function(head) {
    const result = []
    while(head){
        result.unshift(head.val)
        head = head.next
    }
    return result
};

其实,很多伙伴听到链表,树等都会怵一怵。其实,静下心来,仔细分析,结合一些简单的遍历递归,大多数情况下都是可以做出来的,或者也会有个解题的思路,后续顺着思路往下扩展就行(当然,那种给算法大佬准备的另说,我也懵)。没有什么捷径可言,多刷刷,就一定会克服它,