题目描述

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

题目解析

这道题目描述很简洁,就一句话,很好理解。

图 1

解法

解法一

初看题目意思就是输出的时候链表尾部的元素放在前面,链表头部的元素放在后面。这不就是 先进后出,后进先出 么。

什么数据结构符合这个要求?

 !

动画 2
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    //使用 栈 这种数据结构
    Stack<Integer> stack = new Stack<>();
    //将链表元素全部存放在 栈 里面
    while (listNode != null) {
        stack.add(listNode.val);
        listNode = listNode.next;
    }
    ArrayList<Integer> ret = new ArrayList<>();
   //取出栈里面的元素
    while (!stack.isEmpty())
        ret.add(stack.pop());
    return ret;
}
}

解法二

第二种方法也比较容易想到,通过链表的构造,如果将末尾的节点存储之后,剩余的链表处理方式还是不变,所以可以使用递归的形式进行处理。

代码如下:

import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    ArrayList<Integer> ret = new ArrayList<>();
    if (listNode != null) {
        ret.addAll(printListFromTailToHead(listNode.next));
        ret.add(listNode.val);
    }
    return ret;
}
}

解法三

如果你还知道链表的更多性质的话,肯定能想到用 头插法 为逆序的特点来解决。

头插法:将链表的左边称为链表头部,右边称为链表尾部。头插法是将右边固定,每次新增的元素都在左边头部增加。

头插法
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    // 头插法构建逆序链表
    ListNode head = new ListNode(-1);
    while (listNode != null) {
        ListNode memo = listNode.next;
        listNode.next = head.next;
        head.next = listNode;
        listNode = memo;
    }
    // 构建 ArrayList
    ArrayList<Integer> ret = new ArrayList<>();
    head = head.next;
    while (head != null) {
        ret.add(head.val);
        head = head.next;
    }
    return ret;
}

End


©著作权归作者所有:来自51CTO博客作者mb5fe18fab305a5的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Python办公自动化|光速对比并提取两份Word/Excel中的不同元素
  2. 一道Leetcode数据库题的三种解法|文末送书
  3. 动画: 快速排序 | 如何求第 K 大元素?
  4. php获取数组中最后一个元素的方法
  5. php实现获取数组中相同/不相同的元素
  6. 为什么推荐使用for-each而不是for循环遍历元素?
  7. Selenium3自动化测试【12】元素定位认知
  8. Jquery对选取到的元素显示指定的长度,对于的字符串用“...”显示
  9. jQuery编程基础精华02(属性、表单过滤器,元素的each,表单选择器,子元

随机推荐

  1. Android Studio 运行模拟器启动失败
  2. 转-Android Studio系列教程六--Gradle多
  3. Android布局常用
  4. Android重力感应
  5. androidSDK无法更新的解决方法之一
  6. Android recycleView的研究和探讨
  7. 线性布局LinearLayout和相对布局Relative
  8. Android将drawable图像转化为二进制字节
  9. ubuntu 安装 android studio
  10. 在已有的Android工程中接入ReactNative