import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Stack;/** * 面试题6:从尾到头打印链表 * 输入一个链表的头节点,从尾到头反过来打印出每个节点的值 */public class No6 { public static void main(String[] args) { //测试用例 //1、输入的链表有多个(1个)节点 //2、特殊输入测试 ListNode test = new ListNode(); test.add(4); test.add(5); test.add(6); test.print(); System.out.println(methord2(test)); } //栈实现。鲁棒性优于递归调用 public static ArrayList<Integer> methord1(ListNode listNode){ ArrayList<Integer> array = new ArrayList<>(); Stack<ListNode> stack = new Stack<>(); while(listNode != null){ stack.push(listNode); listNode = listNode.next; } while(!stack.empty()){ array.add(stack.pop().val); } return array; } //递归实现.注意,如果链表很长时,会导致函数调用层级很深,有可能导致函数调用栈溢出。 public static ArrayList<Integer> methord2(ListNode listNode){ ArrayList<Integer> array = new ArrayList<>(); if(listNode!=null){ if(listNode.next!=null){ array = methord2(listNode.next); } array.add(listNode.val); } return array; } static class ListNode { int val; //数值 data ListNode next; // 结点 node ListNode(int x) { //可以定义一个有参构造方法,也可以定义一个无参构造方法 val = x; } public ListNode() { } // 添加新的结点 public void add(int newVal) { ListNode newNode = new ListNode(newVal); if (this.next == null) this.next = newNode; else this.next.add(newVal); } // 打印链表 public void print() { System.out.print(this.val); if (this.next != null) { System.out.print("-->"); this.next.print(); } }}}