题目描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
输入:{1,2,3}
返回值:[3,2,1]
算法思路
思路一:借助栈
可以借助栈的“后进先出”的性质,遍历链表,依次把节点的值压进栈中,然后再遍历栈,把栈中的元素存进结果数组中。
思路二:递归
递归链表,借助系统帮我们压栈的性质,从而实现从尾到头的存储
思路三:借助ArrayList的API
ArrayList中有一个方法add(index,value),可以指定index插入value的值。所以在遍历链表的时候可以把值插入到index=0的位置,从而实现逆序输出链表
代码实现
实现一
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.*;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> s = new Stack<>();
ListNode p = listNode;
while(p!=null){
s.push(p.val);
p = p.next;
}
ArrayList<Integer> res = new ArrayList<>();
while(!s.isEmpty()){
res.add(s.pop());
}
return res;
}
}
实现二
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> res = new ArrayList<>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode==null){
return res;
}
printListFromTailToHead(listNode.next);
res.add(listNode.val);
return res;
}
}
实现三
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
ListNode p = listNode;
while(p!=null){
list.add(0,p.val);
p = p.next;
}
return list;
}
}