这是我写的第一个系列,我会尽可能详细的将剑指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不为空
也就是说,这段代码首先会一直递,递到链表的尾结点,然后开始归。
至此,本题结束,下次见啦