持续创作,加速成长!这是我参与「掘金日新计划 · 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
};
其实,很多伙伴听到链表,树等都会怵一怵。其实,静下心来,仔细分析,结合一些简单的遍历递归,大多数情况下都是可以做出来的,或者也会有个解题的思路,后续顺着思路往下扩展就行(当然,那种给算法大佬准备的另说,我也懵)。没有什么捷径可言,多刷刷,就一定会克服它,