题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
代码头: public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { }
注意: 分析代码头,应该返回 ArrayList类型的引用。 即返回return list;
分析:按照递归的性质,层层递归到最底层
有 listNode!=null, 且listNode.next==null ;list.add(listNode.val);
else{
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
最底层执行,会结束该层递归,继续执行上一层的递归。最终实现从尾到头的打印。
代码:
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> list=new ArrayList<>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode==null){
return list;
}
else{
printListFromTailToHead(listNode.next);//当listNode!=null,listNode==null,则执行return list,相当于结束该层递归,返回上一层递归
list.add(listNode.val);
}
return list;
}
}
代码优化: 考虑到链表为空,返回空的list,于是可以省略 if(listNode==null){ return list;}
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;
}
}
方法2.
利用栈先进后出的特性。
import java.util.Stack;
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> stack=new Stack<>();
while(listNode!=null){
stack.push(listNode.val);
listNode=listNode.next;
}
ArrayList<Integer> list=new ArrayList<>();
while(!stack.isEmpty()){
list.add(stack.pop());
}
return list;
}
}
参考牛客网:https://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035