题目:从尾到头打印链表

考点:链表

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

法一:ArrayList头插法

 /**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
public class Solution {
//ArrayList头插法实现栈功能
ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
while(listNode != null){
//0 是插入的为值 val 就是吧每次的值取出来插入到0的位置。其他之前的插入的向后顺序移动。
list.add(0,listNode.val);
listNode = listNode.next;
}
return list;
}
}

法二:使用Collections的reverse方法,将list反转

 /**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.Collections;
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
while(listNode != null){
list.add(listNode.val);
listNode = listNode.next;
}
//使用Collections的reverse方法,直接将list反转
Collections.reverse(list);
return list;
}
}

法三:递归法

 /**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
public class Solution {
//递归实现
ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode != null){
this.printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
}

递归的点在printListFromTailToHaed(listNode.next)这个节点,那么在最后一次递归方法返回以后,每一层的递归方法都会做一个arrayList.add(lizxstNode.val)这个操作,从最后一次到第一次,逆向的调用了后面的方法。因为之前的递归点已经返回了。

法四:用栈实现

 /**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.Collections;
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
ArrayList<Integer> list = new ArrayList<Integer>();
Stack<ListNode> stack = new Stack<ListNode>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
while(listNode != null){
stack.push(listNode);
listNode = listNode.next;
}
//利用栈后进先出的特点实现翻转
while(!stack.isEmpty()){
list.add(stack.pop().val);
}
return list;
}
}

最新文章

  1. 三、基于hadoop的nginx访问日志分析--计算时刻pv
  2. springMVC之web.xml配置
  3. [keepalved]主从上同时出现VIP,无法消失情况
  4. IT外包行业与职业发展
  5. javascript --- 设计模式之单体模式(二)
  6. Summary: Merge Sort of Array &amp;&amp; 求逆序对
  7. typedef函数指针用法
  8. 第三百四十一天 how can I 坚持
  9. winform调用WCF默认实例
  10. php之类,对象(四)加载类及练习题
  11. POJ1679(次小生成树)
  12. &lt;ul&gt;标签设计简单导航栏
  13. System.Transactions 事务超时属性
  14. 芝麻HTTP:如何寻找爬虫入口
  15. SpringBoot 请求参数后端校验
  16. pdf.js的使用
  17. vue-cli 上传图片上传到OSS(阿里云)
  18. restful : 面向资源架构
  19. golang语言中os/user包的学习与使用
  20. BugPhobia开发篇章:Beta阶段第VI次Scrum Meeting

热门文章

  1. 四、PyQt5布局管理(绝对&amp;相对、水平、垂直、格栅、表单)
  2. 磨人的Fragment的转换
  3. kbmmw 5.08 正式发布
  4. 【竞价网站绝技】根据访客ip,页面显示访客所属城市的html代码(借用YY IP地址库)
  5. windows 多网卡路由设置
  6. Django路由分配及渲染
  7. elasticsearch 修改磁盘比例限制
  8. leetcode - valid number 正则表达式解法
  9. (转)pycharm常用快捷键
  10. Linux目录/usr结构说明