【JAVA】从零开始的剑指offer 01-从头到尾打印链表

本文详细介绍了如何使用非递归和递归两种方法,从尾到头地打印链表的元素。非递归方法利用栈的先进后出特性,先将链表元素压入栈,再依次弹出放入ArrayList。递归方法则通过系统栈自然实现逆序,直到遇到链表尾部,再逐层返回添加元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是我写的第一个系列,我会尽可能详细的将剑指offer-JAVA板块的所有题目从多个角度写出全面的题解,我会将其描述的简易直白,将每一段代码解释清楚,希望大家可以通过我文章对这套题目有透彻的理解,点个关注么么哒

OJ链接:从尾到头打印链表_牛客题霸_牛客网

题目描述:

 这道题是给出一个链表的头结点,然后将这个链表中的值从尾到头的顺序存储到一个数组中并且将这个数组当作返回值返回。

首先可以肯定的是,这是一个单向链表(别问我为什么如果是双向链表就不会出这种题了),我们可以首先根据题目中给出的示例,画出这个链表的结构

既然这个链表的结点中 没有指向前驱的变量存在,那我们想要逆序遍历他,就一定要引入一个别的数据结构-栈(Stack)

栈的特点是:先进后出

直击痛点!然后我们唰的一下就可以给他秒了!

方法1:非递归

很简单的啦,第一步,首先创建一个栈,然后我们回头一看 ,给出的初始代码中,方法的返回值是ArrayList<Integer>,题目中说了要返回一个数组,而顺序表的底层结构就是一个数组,显而易见,我们还需要创建一个顺序表用来接收这个链表的元素

public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        //1.创建一个栈
        Stack<ListNode> stack = new Stack<>();
        //创建一个ArrayList
        ArrayList<Integer> arrayList = new ArrayList<>();
}

然后就是喜闻乐见的链表遍历,别跟我说你不会这个!!那你刷什么剑指offer

遍历的时候顺便把元素给放进去,最后在遍历栈,将栈中的元素放到顺序表中,这道题就ok了

简单的我想尽可能多写点都不知道写什么...

public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        //1.创建一个栈
        Stack<ListNode> stack = new Stack<>();
        //创建一个ArrayList
        ArrayList<Integer> arrayList = new ArrayList<>();

        while (listNode != null){
            stack.push(listNode);
            listNode = listNode.next;
        }
        while (stack.isEmpty()){
            arrayList.add(stack.pop().val);
        }
        return arrayList;
    }
}

这里有一个小细节:ArrayList创建的时候我们限定了它的范围是Integer,而创建栈时限定的范围是ListNode(链表结点),所以将栈中的元素放到顺序表中时,记得加.val哦

方法2:递归

这个方法就比较厉害了,我们不需要自己创建栈,借助系统自带的栈就可以完成

首先放出完整代码

public class Solution {
    ArrayList<Integer> arrayList = new ArrayList<>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode!= null){
            printListFromTailToHead(listNode.next);
            arrayList.add(listNode.val);
        }
        return arrayList;
    }
}

这里的递归我给出的中止条件是listNode不为空

也就是说,这段代码首先会一直递,递到链表的尾结点,然后开始归。

至此,本题结束,下次见啦 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不卷啊

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值