剑指OfferJZ3:从尾到头打印链表-java版
JZ3:从尾到头打印链表
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为
[3,2,1]
0 <= 链表长度 <= 10000
法一:使用栈(先进先出)
把链表中的数依次放入栈中,再从栈中依次取出,根据栈先进后出的特点,正好满足按从尾到头的顺序返回链表每个节点的值
public class jz3 {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
Stack<Integer> stack = new Stack<>();//栈
//遍历链表
while(listNode!=null){
stack.add(listNode.val);//取当前节点的值放入栈中
listNode=listNode.next;//更新当前节点为下一个节点
}
while(!stack.isEmpty()){
list.add(stack.pop());//取出当前栈顶元素
}
return list;
}
}
class ListNode{
int val;
ListNode next=null;
ListNode(int val){
this.val =val;
}
}
法二:采用递归的方式模拟代码反置的作用
public class jz3 {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//法二:采用递归的方式模拟代码反置的作用
ArrayList<Integer> list = new ArrayList<>();
return solve(list,listNode);
}
private ArrayList<Integer> solve(ArrayList<Integer> list, ListNode listNode) {
if(listNode.next!=null){//如果当前节点的下个节点有值,我们就继续去递归
list=solve(list,listNode.next);
}
list.add(listNode.val);
//System.out.println(list);
return list;
}