题目描述
输入一个链表,从尾到头打印链表每个节点的值。
/*链表结构
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.Collections;
import java.util.Stack;
class ListNode
{
int val;
ListNode next = null;
ListNode(int val)
{
this.val = val;
}
}
public class Offer03
{
public static void main(String[] args)
{
ListNode[] node = new ListNode[10];
for(int i = 0; i < 10; i++)
node[i] = new ListNode(i);
for(int i = 0; i < 9; i++)
node[i].next = node[i+1];
node[9].next = null;
ArrayList<Integer> list = printListFromTailToHead3(node[0]);
for(int i = 0; i < list.size(); i++)
{
System.out.println(list.get(i));
}
}
public static ArrayList<Integer> printListFromTailToHead(ListNode listNode)
{//解法一:遍历链表,把链表中的值依次添加到ArrayList类型的列表里;
//然后逆序遍历这个列表,将值依次添加到另一个ArrayList列表里;
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> list2 = new ArrayList<Integer>();
while (listNode != null)
{
list.add(listNode.val);
listNode = listNode.next;
}
for (int i = list.size() - 1; i >= 0; i--)
{
list2.add(list.get(i));
}
return list2;
}
public static ArrayList<Integer> printListFromTailToHead2(ListNode listNode)
{//解法二:遍历链表,把链表中的值依次添加到ArrayList类型的列表里;
//利用java.util.Collections类提供的反转集合函数,将列表逆序。
ArrayList<Integer> list = new ArrayList<Integer>();
Stack<Integer> stack = new Stack();
while (listNode != null)
{
stack.push(listNode.val);
listNode = listNode.next;
}
while(!stack.isEmpty())
list.add(stack.pop());
return list;
}
public static ArrayList<Integer> printListFromTailToHead3(ListNode listNode)
{//解法三:遍历链表,把链表中的值依次添加到stack类型的栈里;
//新建一个ArrayList类型的列表,依次添加从栈里弹出来的值。
ArrayList<Integer> list = new ArrayList<Integer>();
while (listNode != null)
{
list.add(listNode.val);
listNode = listNode.next;
}
Collections.reverse(list);
return list;
}
}
查阅java文档发现,java.util.stack类是遗留类,最好使用ArrayDeque类替代。