题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
import java.util.ArrayList;
import java.util.Stack;
public class 从尾到头打印链表 {
public static void main(String[] args) {
ListNode one = new ListNode(1);
ListNode two = new ListNode(2);
ListNode three = new ListNode(3);
ListNode four = new ListNode(4);
one.next = two;
two.next = three;
three.next = four;
ArrayList<Integer> list = printListDg(one);
for (Integer l:list) {
System.out.printf(l.toString()+" ");
}
}
//头插法
public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<Integer>();
ListNode head = new ListNode(0); // 头结点 另外一个指针
while (listNode != null) {
ListNode temp = listNode.next; //先保存下一个结点
listNode.next = head.next; // 当前结点指向上一个结点
head.next = listNode; //头结点指向当前结点,保存当前结点
listNode = temp; //当前结点变成下一个结点
}
while (head.next != null) {
list.add(head.next.val);
head = head.next;
}
return list;
}
//利用栈的先进后出
public static ArrayList<Integer> printListStack(ListNode listNode) {
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;
}
//递归 一直next到最后一个结点再回溯。注意每次都new了一个list
public static ArrayList<Integer> printListDg(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (listNode != null) {
list.addAll(printListDg(listNode.next));
list.add(listNode.val);
}
return list;
}
}