题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
}
}
分析
分析思路1:从尾到头打印链表不就是运用了先入后出的原理,也就是我们常说的栈了。
分析思路2:从函数的返回值类型可以看出我们需要返回的是一个ArrayList类型,所以我们可以直接声明一个ArrayList,从链表中
遍历数据,存入ArrayList。
分析思路3:从尾到头的输出我们往往可以去考虑递归,我们可以将链表逐步缩小规模,每次仅取出一个数据。存入ArrayList。
方法一:
定义栈结构
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//定义栈Stack
Stack<Integer> stack=new Stack<>();
//遍历链表,并入栈Stack
while(listNode!=null){
stack.push(listNode.val);
listNode = listNode.next;
}
//定义ArrayList,因为返回值为ArrayList
ArrayList<Integer> list = new ArrayList<>();
//出栈
while(!stack.isEmpty()){
list.add(stack.pop());
}
return list;
}
方法二:
顺序存入ArrayList,反向排序
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
//方法一
//add方法,可以将数据插入特定位置之前,我们在0号索引处插入,可实现从尾到头
while(listNode!=null){
list.add(0,listNode.val);
listNode = listNode.next;
}
//方法二
//存入ArrayList,使用reverse翻转
// while(listNode!=null){
// list.add(listNode.val);
// listNode = listNode.next;
// }
// Collections.reverse(list);
return list;
}
方法三:
递归
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
if(listNode.next!=null){
list = printListFromTailToHead(listNode.next);
}
list.add(listNode.val);
return list;
}