输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
链表节点的定义:
public static class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
方法一:
改变链表的指针,由尾指向头,再按顺序打印数值(设置三个节点 pre node next 改变顺序比较方便)
public static ArrayList<Integer> printListFromTailToHead(ListNode head) {
ListNode pre = null;
ListNode next = null;
//改变节点的指针顺序
while(head != null){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
//按照顺序打印数值
List list = new ArrayList();
while(pre != null){
list.add(pre.val);
pre = pre.next;
}
return (ArrayList<Integer>) list;
}
方法二:建立一个Stack,依次遍历链表,把遍历到的节点存入到Stack中,最后再从stack中按顺序取出
public static ArrayList<Integer> printListFromTailToHead2(ListNode head){
Stack<Integer> stack = new Stack<Integer>();
while(head != null){
stack.push(head.val);
head = head.next;
}
ArrayList<Integer> list = new ArrayList<Integer>();
while(!stack.isEmpty()){
list.add(stack.pop());
}
return list;
}
测试
public static void main(String[] args){
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = null;
// List list = printListFromTailToHead(node1);
List list = printListFromTailToHead2(node1);
System.out.print(list.toString());
}