题目:

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

一、方法一

1、分析

listNode 是链表,只能从头遍历到尾,但是输出却要求从尾到头,这是典型的”先进后出”,我们可以想到栈!
ArrayList 中有个方法是 add(index,value),可以指定 index 位置插入 value 值
所以我们在遍历 listNode 的同时将每个遇到的值插入到 list 的 0 位置,最后输出 listNode 即可得到逆序链表

2、代码一

  1. public class Solution {
  2. public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
  3. ArrayList<Integer> list = new ArrayList<>();
  4. ListNode tmp = listNode;
  5. while(tmp!=null){
  6. list.add(0,tmp.val);
  7. tmp = tmp.next;
  8. }
  9. return list;
  10. }
  11. }

3、代码二(my)

脱了裤子放屁

  1. ListNode node = listNode;
  2. int count = 0;
  3. int k;
  4. while(listNode!=null)
  5. {
  6. count++;
  7. listNode = listNode.next;
  8. }
  9. k = count-1;
  10. ArrayList<Integer> arrlist = new ArrayList<Integer>();
  11. ArrayList<Integer> arr = new ArrayList<Integer>();
  12. for(int i=0;i<count;i++)
  13. {
  14. arrlist.add(i,(Integer) node.val);
  15. node = node.next;
  16. }
  17. for(int i = 0;i<count;i++)
  18. {
  19. int m = arrlist.get(k--);
  20. arr.add(m);
  21. }
  22. return arr;

二、方法二

1、分析

递归实现

2、代码

  1. import java.util.*;
  2. public class Solution {
  3. ArrayList<Integer> list = new ArrayList();
  4. public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
  5. if(listNode!=null){
  6. printListFromTailToHead(listNode.next);
  7. list.add(listNode.val);
  8. }
  9. return list;
  10. }
  11. }

三、方法三

1、分析

利用栈实现

2、代码

  1. 链接:https://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035?answerType=1&f=discussion
  2. 来源:牛客网
  3. public ArrayList printListFromTailToHead(ListNode listNode) {
  4. ArrayList list = new ArrayList();
  5. Stack stack = new Stack();
  6. while (listNode != null) {
  7. stack.push(listNode.val);
  8. listNode = listNode.next;
  9. }
  10. while (!stack.empty()) {
  11. list.add(stack.pop());
  12. }
  13. return list;
  14. }