题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
思路:按顺序遍历链表,利用栈保存节点的值,之后再输出
package jianzhioffer;
import java.util.ArrayList;
import java.util.Stack;
public class PrintListReverse {
public static class ListNode
{
int val;
ListNode next = null;
ListNode(int val)
{
this.val = val;
}
}
//1.非递归方法
public static ArrayList<Integer> printListFromTailToHead(ListNode listNode)
{
Stack<Integer> stack = new Stack<Integer>();
ArrayList<Integer> arrayList = new ArrayList<Integer>();
ListNode node = listNode;
while(node != null)
{
stack.push(node.val); //元素入栈
node = node.next;
}
while(!stack.empty())
{
arrayList.add(stack.pop());
}
return arrayList;
}
public static void main(String args[])
{
ListNode listNode = new ListNode(1);
listNode.next = new ListNode(2);
listNode.next.next = new ListNode(3);
System.out.println(printListFromTailToHead(listNode));
}
}
递归本身就是一个栈,因此可以使用递归来实现,每访问到一个节点时,先递归输出其后面的节点,再输出该节点自身。
package jianzhioffer;
public class PrintListReverse {
public static class ListNode
{
int val;
ListNode next = null;
ListNode(int val)
{
this.val = val;
}
}
//2.递归
public static void printListFromToHead(ListNode listNode)
{
if(listNode.next != null)
printListFromToHead( listNode.next);
System.out.println(listNode.val);
}
public static void main(String args[])
{
ListNode listNode = new ListNode(1);
listNode.next = new ListNode(2);
listNode.next.next = new ListNode(3);
printListFromToHead(listNode);
}
}