试题:
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
代码:
链表由于存储的不连续性,导致对其的访问只能一个接着一个访问。而题目要求从后向前输出节点值。这就要求我们从头往尾访问同时再从后向前输出。非常符合先进后出的情况。可以使用递归返回时存储节点值或着使用栈的先进后出规则。
* 递归方式:可以先将递归书写出来,然后根据递归中函数的执行先后顺序,将res.add放置在合适位置(本代码就是反之在调用递归函数之后)。注意res.add不要放在this.printListFromTailToHead下一句,这会导致最后一个节点无法存储。
* 关于递归的几种存储数据的方式:
* 1、如果你把数据存储代码放在调用递归函数之前,意味着你访问数据的顺序是从前往后访问的(递归调用过程)。
* 2、如果你把数据存储代码放在调用递归函数之后,意味着你访问数据的顺序是从后往前访问的(递归返回过程)。
* 3、你还可以通过递归函数返回数据的方式来获得数据。
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> res = new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode == null) return res;
if(listNode.next != null){
this.printListFromTailToHead(listNode.next);
}
res.add(listNode.val);
return res;
}
}
* 通过递归函数返回值的方式,下列代码非完全正确,只是思维参考。
ArrayList<Integer> res = new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode == null) return res;
if(listNode.next != null){
Integer tem = this.printListFromTailToHead(listNode.next);
res.add(listNode.val);
}
*节点返回值
return listNode.val;
}
res.add(this.printListFromTailToHead(listNode));