剑指offer(3)之从尾到头打印链表

题目:输入一个链表,按链表从尾到头的顺序返回一个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 }
原文地址:https://www.cnblogs.com/quxiangjia/p/12520577.html