第一种: 顺序遍历, 顺序添加, 反转
步骤:
- 依次遍历链表;
- 遍历时元素顺序添加到 ArrayList 中;
- 最后使用 Collections.reverse() 方法反转;
import java.util.ArrayList; import java.util.Collections; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> list = new ArrayList<>(); while(listNode != null) { list.add(listNode.val); listNode = listNode.next; } Collections.reverse(list); return list; } }
第二种: 干嘛不在插入时就保持逆序呢?
ArrayList 提供了两种插入单个元素的方式:
void add(int index, E element)
Inserts the specified element at the specified position in this list.
在当前 list 的指定位置插入指定元素.
boolean add(E e)
Appends the specified element to the end of this list.
在当前 list 的尾部添加指定元素.
可以看到 add() 本身可以具有逆序的功能, 只需要每次将新的元素添加到 list 头部即可.
import java.util.ArrayList; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> res = new ArrayList<>(); while(listNode != null) { res.add(0, listNode.val); listNode = listNode.next; } return res; } }
第三种: 递归 (我这脑瓜是想不出来的, 看了大家的题解才知道的)
思想: 在遍历过程中,如果不是最后一个元素,则继续往下递归;否则,向 ArrayList 中添加元素,并向上返回 ArrayList.
值得注意的是, ArrayList 不能在方法内声明和定义. 需要定义一个全局变量 (对方法来说)
import java.util.ArrayList; public class Solution { private final ArrayList<Integer> res = new ArrayList<>(); public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { if(listNode != null) { printListFromTailToHead(listNode.next); res.add(listNode.val); } return res; } }