题目:从尾到头打印链表
考点:链表
题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
法一:ArrayList头插法
1 /** 2 * public class ListNode { 3 * int val; 4 * ListNode next = null; 5 * 6 * ListNode(int val) { 7 * this.val = val; 8 * } 9 * } 10 * 11 */ 12 import java.util.ArrayList; 13 public class Solution { 14 //ArrayList头插法实现栈功能 15 ArrayList<Integer> list = new ArrayList<Integer>(); 16 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { 17 while(listNode != null){ 18 //0 是插入的为值 val 就是吧每次的值取出来插入到0的位置。其他之前的插入的向后顺序移动。 19 list.add(0,listNode.val); 20 listNode = listNode.next; 21 } 22 return list; 23 } 24 }
法二:使用Collections的reverse方法,将list反转
1 /** 2 * public class ListNode { 3 * int val; 4 * ListNode next = null; 5 * 6 * ListNode(int val) { 7 * this.val = val; 8 * } 9 * } 10 * 11 */ 12 import java.util.Collections; 13 import java.util.ArrayList; 14 public class Solution { 15 ArrayList<Integer> list = new ArrayList<Integer>(); 16 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { 17 while(listNode != null){ 18 list.add(listNode.val); 19 listNode = listNode.next; 20 } 21 //使用Collections的reverse方法,直接将list反转 22 Collections.reverse(list); 23 return list; 24 } 25 }
法三:递归法
1 /** 2 * public class ListNode { 3 * int val; 4 * ListNode next = null; 5 * 6 * ListNode(int val) { 7 * this.val = val; 8 * } 9 * } 10 * 11 */ 12 import java.util.ArrayList; 13 public class Solution { 14 //递归实现 15 ArrayList<Integer> list = new ArrayList<Integer>(); 16 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { 17 if(listNode != null){ 18 this.printListFromTailToHead(listNode.next); 19 list.add(listNode.val); 20 } 21 return list; 22 } 23 }
递归的点在printListFromTailToHaed(listNode.next)这个节点,那么在最后一次递归方法返回以后,每一层的递归方法都会做一个arrayList.add(lizxstNode.val)这个操作,从最后一次到第一次,逆向的调用了后面的方法。因为之前的递归点已经返回了。
法四:用栈实现
1 /** 2 * public class ListNode { 3 * int val; 4 * ListNode next = null; 5 * 6 * ListNode(int val) { 7 * this.val = val; 8 * } 9 * } 10 * 11 */ 12 import java.util.Collections; 13 import java.util.ArrayList; 14 import java.util.Stack; 15 public class Solution { 16 ArrayList<Integer> list = new ArrayList<Integer>(); 17 Stack<ListNode> stack = new Stack<ListNode>(); 18 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { 19 while(listNode != null){ 20 stack.push(listNode); 21 listNode = listNode.next; 22 } 23 //利用栈后进先出的特点实现翻转 24 while(!stack.isEmpty()){ 25 list.add(stack.pop().val); 26 } 27 return list; 28 } 29 }