欢迎光临散文网 会员登陆 & 注册

算法:从尾到头打印链表

2022-05-13 10:25 作者:做架构师不做框架师  | 我要投稿


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

示例

输入:head = [1,3,2]

输出:[2,3,1]

限制:0 <= 链表长度 <= 10000

方法一:栈

栈的特点是后进先出,即最后压入栈的元素最先弹出。考虑到栈的这一特点,使用栈将链表元素顺序倒置。从链表的头节点开始,依次将每个节点压入栈内,然后依次弹出栈内的元素并存储到数组中。

  • 创建一个栈,用于存储链表的节点

  • 创建一个指针,初始时指向链表的头节点

  • 当指针指向的元素非空时,将指针指向的节点放入到栈中,并且将指针指向当前节点的下一个节点

  • 获取栈的大小,并且创建一个数组,其大小为 是栈的大小

  • 循环遍历从栈内弹出一个节点,并且将节点的值存到数组中

  • 最后返回结果

代码如下:

复杂度分析

  • 时间复杂度:O(n)。正向遍历一遍链表,然后从栈弹出全部节点,等于又反向遍历一遍链表。

  • 空间复杂度:O(n)。额外使用一个栈存储链表中的每个节点。

方法二:递归法

先走至链表末端,回溯时依次将节点值加入列表 ,这样就可以实现链表值的倒序输出。

  • 递推阶段:每次传入 head.next ,以 head == null(即走过链表尾部节点)为递归终止条件,此时直接返回。

  • 回溯阶段: 层层回溯时,将当前节点值加入列表,即tmp.add(head.val)。

  • 最终,将列表 tmp 转化为数组 res ,并返回即可。

代码如下:

复杂度分析

  • 时间复杂度 O(N): 遍历链表,递归 N 次。

  • 空间复杂度 O(N): 系统递归需要使用 O(N) 的栈空间。

写在最后

本文内容出处是力扣官网,希望和大家一起刷算法,在后面的路上不变秃但是变强!

好兄弟可以点赞并关注我的公众号“javaAnswer”,全部都是干货。


算法:从尾到头打印链表的评论 (共 条)

分享到微博请遵守国家法律