当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

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

解法

解法一【推荐】

遍历链表,每个链表结点值 push 进栈,最后将栈中元素依次 poplist 中。

  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. import java.util.Stack;
  14. /**
  15. * @author bingo
  16. * @since 2018/10/28
  17. */
  18. public class Solution {
  19. /**
  20. * 从尾到头打印链表
  21. * @param listNode 链表头节点
  22. * @return list
  23. */
  24. public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
  25. ArrayList<Integer> res = new ArrayList<>();
  26. if (listNode == null) {
  27. return res;
  28. }
  29. Stack<Integer> stack = new Stack<>();
  30. while (listNode != null) {
  31. stack.push(listNode.val);
  32. listNode = listNode.next;
  33. }
  34. while (!stack.isEmpty()) {
  35. res.add(stack.pop());
  36. }
  37. return res;
  38. }
  39. }

解法二【不推荐】

利用递归方式:

  • 若不是链表尾结点,继续递归;
  • 若是,添加到 list 中。

这种方式不推荐,当递归层数过多时,容易发生 Stack Overflow

  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. import java.util.Stack;
  14. /**
  15. * @author bingo
  16. * @since 2018/10/28
  17. */
  18. public class Solution {
  19. /**
  20. * 从尾到头打印链表
  21. * @param listNode 链表头结点
  22. * @return list
  23. */
  24. public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
  25. ArrayList<Integer> res = new ArrayList<>();
  26. if (listNode == null) {
  27. return res;
  28. }
  29. addElement(listNode, res);
  30. return res;
  31. }
  32. private void addElement(ListNode listNode, ArrayList<Integer> res) {
  33. if (listNode.next != null) {
  34. // 递归调用
  35. addElement(listNode.next, res);
  36. }
  37. res.add(listNode.val);
  38. }
  39. }

测试用例

  1. 功能测试(输入的链表有多个结点;输入的链表只有一个结点);
  2. 特殊输入测试(输入的链表结点指针为空)。

该分类下的相关小册推荐: