剑指offer3:从尾到头打印链表
题目描述:
从尾到头打印链表:输入一个链表,从尾到头打印链表每个节点的值。
思路:
尽量不改变原输入数据的结构,比如不要将指针改为从尾到头
非递归:使用栈操作,从头到尾入栈,从尾到头出栈即可
递归:更加简洁的代码,当访问某个节点时,先输出它的后一个节点
1 public class Lianbiaotoudaowei { 2 //非递归,栈操作 3 public ArrayList<Integer> printListFromTailToHead(ListNode listNode){ 4 Stack<Integer> stack = new Stack<>(); 5 ArrayList<Integer> list = new ArrayList<Integer>(); 6 while(listNode!=null){ 7 stack.add(listNode.val); 8 listNode = listNode.next; 9 } 10 while(!stack.isEmpty()){ 11 list.add(stack.pop()); 12 } 13 return list; 14 } 15 //递归: 16 public ArrayList<Integer> printListFromTailToHead(ListNode listNode){ 17 ArrayList<Integer> list = new ArrayList<>(); 18 if(listNode!=null){ 19 if(listNode.next!=null){ 20 list = printListFromTailToHead(listNode.next); 21 } 22 list.add(listNode.val); 23 } 24 return list; 25 } 26 public static void main(String[] args) { 27 // TODO Auto-generated method stub 28 ListNode listNode = new ListNode(1); 29 listNode.next = new ListNode(2); 30 listNode.next = new ListNode(3); 31 listNode.next = new ListNode(4); 32 listNode.next = new ListNode(5); 33 34 Lianbiaotoudaowei lianbiaotoudaowei = new Lianbiaotoudaowei(); 35 System.out.println(lianbiaotoudaowei.printListFromTailToHead(listNode)); 36 } 37 38 }