< 每日算法 - JavaScript解析:从尾到头打印链表 >

在这里插入图片描述

一、任务描述:

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

注意:0 <= 链表长度 <= 10000

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {number[]}
 */
 var reversePrint = function(head) {
    ...
};

本题取自 leetcode 剑指 offer

Tips: 今天的题目虽然短,但是没接触过,要理解还是有难度的。接下来,开始今天的算法题吧!

》 示例一:

function ListNode(val) {
    this.val = val;
    this.next = null;
}

输入:head = [0,1,2]
输出:[2,1,0]

其中的head并非简单的数组类型,而是一个封装的链表结构。而链表结构并不能简单的直接去操作它。
所以就需要通过逻辑语句去操作了

根据题目,我们肯定觉得简单。但是相信leetcode不会出无意义的题目。 本题主要是让我们理解递归的概念。 所以,大脑开始燃烧吧!

在这里插入图片描述

二、题意解析

根据题目,我们可以知道,我们需要将链表head进行倒序输出,就如同倒序数组那样。但是链表结构只能按照链表的操作来,head.val用于获取当前的值,head.next用于获取后面的值。

至此,有两种解决方案如下:

  1. 我们可以通过循环取出链表每个节点的值,存入数组。然后利用数组中的 arr.reverse(),输出倒序的链表内容;
  2. 以示例一为例,通过递归将指定的链表内容,一层一层的倒置存储。最后,输出递归运算过的最终结果;

拓展知识

  • 链表 是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

  • 递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言(如Scheme)中习惯用递归来实现循环。

如需了解递归算法更详细的,可以看看这篇文章: 一文看懂递归


三、解决方案:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {number[]}
 */
var reversePrint = function(head) {
    // 方法一:使用循环读取对于内容
    if(!head) return []
    let result = []
    while(head) {
        result.push(head.val)
        head = head.next
    }
    return result.reverse()


    // return  head_r.reverse()

    // 方法二: 使用递归读取内容
    if(!head) return []
    let result = reversePrint(head.next)
    result.push(head.val)

    return result
};

本题难度不算难,重在理解递归的思路,举一反三。 好了,今天的小温的每日算法结束,觉得不错的,麻烦三连支持下吧!

递归进阶题目: 二叉树灯饰

往期内容 💨

🔥 < CSS小技巧:filter滤镜妙用>

🔥 < JavaScript技术分享: 大文件切片上传 及 断点续传思路 >

🔥 < 每日技巧: JavaScript代码优化 >

🔥 < 每日知识点:关于Javascript 精进小妙招 ( Js技巧 ) >

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术宅小温

你小小的鼓励,是我搬砖的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值