输入一个单链表,按照链表值从尾到头的顺序返回一个ArrayList。
解:
首先最容易想到的就是先正序输出到ArrayList,然后在翻转ArrayList即可。代码如下:
ArrayList<Integer> lists = new ArrayList<>();
while(listNode != null){
lists.add(listNode.val);
listNode = listNode.next;
}
ArrayList<Integer> arrayList = new ArrayList<>();
for(int i = lists.size() - 1; i >= 0 ; i--){
arrayList.add(lists.get(i));
}
return arrayList;
当然也可以借助一个栈该操作:
Stack<Integer> stack = new Stack<>();
while(listNode != null){
stack.push(listNode.val);
listNode = listNode.next;
}
ArrayList<Integer> lists = new ArrayList<>();
while(!stack.isEmpty()){
lists.add(stack.pop());
}
return lists;
但是这两种方法都借助了另外的内存空间,浪费了内存,是否可以使用递归操作呢,利用递归回溯过程中将链表中的元素一一添加到ArrayList中呢,递归到最后一个时,listNode为null,开始回溯,从尾节点开始,每一个结点都被加入list中。代码如下:
if(listNode != null){
printListFromTailToHead(listNode.next);
lists.add(listNode.val);
}
return lists;