剑指offer 动画图解 | 从尾到头打印链表

通过刷题剑指offer,可以有效提升面试的成功率,这是因为技术岗位的面试总是离不开算法题。如果想要在算法题方面表现得好的话,刷题是唯一的捷径。

正所谓:书山有路勤为径

题目描述

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

解题思路

题目给了我们一个单向链表,我们需要反向输出每个节点的值。然而,单向链表的一个特点就是只能正向遍历,无法反向遍历,因为每个节点只有指向下一个节点的指针,并没有指向上一个节点的指针,所以无法访问上一个节点。

既然我们没有办法一边遍历链表节点,一边输出节点的值,那么我们是否可以先把每个节点的值储存起来,最后再将他们颠倒过来呢?

有一个数据结构的特性非常符合我们的要求,那就是 (stack)。

由于栈有后进先出的特点,我们只需要将所有节点的值压入栈里,然后再依次弹出,它们的顺序就会被颠倒过来了。

算法

算法的基本步骤可以分解为:

  1. 创建一个栈
  2. 遍历链表并将节点的值压入栈
  3. 创建一个ArrayList
  4. 将栈里的元素弹出并插入到ArrayList里,直到栈为空

算法代码

import java.util.ArrayList;
import java.util.Stack;

public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    Stack<Integer> stack = new Stack<>();

    while (listNode != null) {
        stack.push(listNode.val);
        listNode = listNode.next;
    }

    ArrayList<Integer> arrayList = new ArrayList<>();

    while (!stack.isEmpty()) {
        int val = stack.pop();
        arrayList.add(val);
    }

    return arrayList;
}

算法动图

在这里插入图片描述

算法效率

效率:O(n)

n 代表链表节点的个数。

遍历 n 个节点,压入 n 个节点入栈,从栈里弹出 n 个节点并插入ArrayList中。因此,效率为 O(n)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值