题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
方法一:非递归
思路1:先用while循环遍历链表的每一个节点,并把每个节点的值存进ArrayList里,之后反向遍历ArrayList,把值存进另外一个ArrayList里,然后返回
代码如下:
1 import java.util.ArrayList; 2 3 class ListNode 4 { 5 6 int val; 7 ListNode next; 8 ListNode(int x) 9 { 10 val = x; 11 } 12 } 13 14 public class Solution { 15 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { 16 ArrayList<Integer> list=new ArrayList<Integer>(); 17 ArrayList<Integer> list2=new ArrayList<Integer>(); 18 19 while (listNode!=null) 20 { 21 list.add(listNode.val); 22 listNode=listNode.next; 23 } 24 for (int i = list.size()-1; i >= 0; i--) 25 { 26 list2.add(list.get(i)); 27 } 28 29 return list2; 30 31 } 32 }
思路2:还是遍历的思路,只是直接使用ArrayList的一个方法list.add(
0
,listNode.val)
,每次从头插入,生成反向链表
代码如下:
1 import java.util.ArrayList; 2 public class Solution { 3 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { 4 ArrayList<Integer> list=new ArrayList<Integer>(); 5 6 7 while (listNode!=null) 8 { 9 list.add(0,listNode.val); 10 listNode=listNode.next; 11 } 12 13 return list; 14 15 } 16 }
方法二:递归
思路:每次在方法中使用子节点递归调用方法在ArrayList的add操作之前,这样当递归调用结束后会先运行最后一个节点的add方法,依次add,生成反向ArrayList返回
代码如下:
1 import java.util.ArrayList; 2 public class Solution { 3 ArrayList<Integer> list=new ArrayList<Integer>(); 4 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { 5 6 if (listNode != null) 7 { 8 printListFromTailToHead(listNode.next); 9 list.add(listNode.val); 10 } 11 return list; 12 13 } 14 }