题目
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
思路
注意:从尾到头的顺序返回一个列表。因此就会想到,递归这个操作。我们都知道递归实质上是包含了两个动作状态,第一个是递推下去,这个毋容置疑,第二个就是回归,那么当我递推过去,回归的时候实质上已经是做了相反的动作,我们可以利用递归本来的性质进行打印输出,即可。
如果不喜欢递归这种操作。可以就按照顺序执行,if改为while。最后再加一个反转函数Collections.reverse(list)
即可。需要注意的是,利用使用该方法就需要 import java.util.Collections;
源代码
- 方法一
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
public class Solution {
// 因为要使用到递归。这里要设置为全局变量
ArrayList<Integer> list = new ArrayList<>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode != null){
// 递归,递归,递归的实质就是一路走到最后,然后再返回
// 题目要求,要打印出相反的列表,那么目前来说递归效率最高
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
}
- 方法二
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
while(listNode != null){
list.add(listNode.val);
listNode = listNode.next;
}
Collections.reverse(list);
return list;
}
}