輸入一個鏈表,從尾到頭打印鏈表每個節點的值。
/*鏈表結構
* 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類替代。