一、任务描述:
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
注意: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用于获取后面的值。
至此,有两种解决方案如下:
- 我们可以通过循环取出链表每个节点的值,存入数组。然后利用数组中的
arr.reverse()
,输出倒序的链表内容; - 以示例一为例,通过递归将指定的链表内容,一层一层的倒置存储。最后,输出递归运算过的最终结果;
拓展知识
-
链表
是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 -
递归算法
(英语: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
};
本题难度不算难,重在理解递归的思路,举一反三。 好了,今天的小温的每日算法结束,觉得不错的,麻烦三连支持下吧!
递归进阶题目: 二叉树灯饰