思路一:
链表遍历的顺序是从头到尾,但是要求输出时是从尾到头。这可以借助栈来实现,每遍历到一个节点的时候将其压入栈中。当遍历完以后再从栈中将节点的值一一取出存放到arraylist中。从栈中先取出来的是原来链表最后的节点,这样就实现了从尾到头的打印。
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(listNode == null)
return list;
Stack<Integer> stack = new Stack<Integer>();
while(listNode != null)//将链表节点的值一一压入栈中
{
stack.add(listNode.val);
listNode = listNode.next;
}
while(!stack.isEmpty())//将栈中的值弹出并保存到list当中
{
list.add(stack.pop());
}
return list;
}
}
思路二:
递归本质上就是一个栈结构,每访问一个节点的时候,先递归输出它后面的节点,再输出该节点本身,这样链表的结果就反过来了
/**
* 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<Integer>();
if(listNode == null)
return list;
if(listNode.next != null)
{
list = printListFromTailToHead(listNode.next);
}
list.add(listNode.val);
return list;
}
}