4、剑指offer——从尾到头打印链表java实现
**题目描述**
**输入一个链表,按链表从尾到头的顺序返回一个ArrayList。**
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
思路:
1.如果链表为空,则直接返回空的ArrayList
2.如果链表非空,遍历链表,按照顺序将链表中的数据添加到ArrayList中
3.反转ArrayList(倒序输出)(倒序方法,文末补充)
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//先创建一个空的ArrayList
ArrayList arrList = new ArrayList();
if(listNode == null) {
return arrList;
}
//遍历链表
int i = 0;
while(listNode.next != null) {
arrList.add(i,listNode.val);
i++;
listNode = listNode.next;
}
//将最后一个节点的数值添加到集合中
arrList.add(i,listNode.val);
//将集合反转
Collections.reverse(arrList);
//Collections.reverse(arrList);
return arrList;
}
}
补充:
集合的复制和反转
1.for循环方法:
2.System.arraycopy()方法:
3.Arrays.copyOf()方法:
4.Object.clone()方法:
public class Test {
public static void main(String[] args) {
int[] array1 = {1,2,3,4,5};
// 1.通过for循环
int[] array2 = new int[5];
for(int i = 0;i < array1.length;i++) {
array2[i] = array1[i];
}
for(int i = 0;i < array2.length;i++) {
System.out.print(array2[i]);
}
System.out.println();
//2.通过System.arraycopy()
int[] array3 = new int[5];
System.arraycopy(array1, 0, array3, 0, 5);
for (int i = 0; i < array3.length; i++) {
System.out.print(array3[i]);
}
System.out.println();
//3.通过Arrays.copyOf()
int[] array4 = new int[5];
array4 = Arrays.copyOf(array1, 5);
for (int i = 0; i < array4.length; i++) {
System.out.print(array4[i]);
}
System.out.println();
//4.通过Object.clone()
int[] array5 = new int[5];
array5 = array4.clone();
for (int i = 0; i < array5.length; i++) {
System.out.print(array5[i]);
}
}
}
各个方法的优缺点
1.for循环方法
代码灵活,但效率低。
2.System.arraycopy()方法
通过源码可以看到,其为native方法,即原生态方法。自然效率更高。
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
3.Arrays.copyOf()方法
同样看源码,它的实现还是基于System.arraycopy(),所以效率自然低于System.arraycpoy()。
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
4.Object.clone()方法
从源码来看同样也是native方法,但返回为Object类型,所以赋值时将发生强转,所以效率不如之前两种。
protected native Object clone() throws CloneNotSupportedException;
如何反转集合?
下面的示例反转使用Collections.reverse(ArrayList)方法的数组列表。
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");
arrayList.add("D");
arrayList.add("E");
System.out.println("Before Reverse Order: " + arrayList);
Collections.reverse(arrayList);
System.out.println("After Reverse Order: " + arrayList);
}
}
上面的代码示例将产生以下结果:
Before Reverse Order: [A, B, C, D, E]
After Reverse Order: [E, D, C, B, A]
感谢:https://www.cnblogs.com/zhaoyan001/p/6520159.html
4、剑指offer——从尾到头打印链表java实现的更多相关文章
- 剑指Offer 从尾到头打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值. 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的“新链表”的表头 思路: 用容器vector,递归到最后一个元素,push_back到 ...
- 剑指offer——从尾到头打印链表节点的值
输入一个链表,从尾到头打印链表每个节点的值. 输入描述:输入为链表的表头 输出描述:输出为需要打印的“新链表”的表头 一.问题分析 初拿到这个题目时,这应该是考察单向链表这一数据结构.单向链表的遍历总 ...
- 剑指Offer——从尾到头打印链表
题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 分析: 方法1:利用栈的性质,先从头到尾遍历链表每个节点的值存入栈中,最后一个一个出栈顺序便是从尾到头的. 方法2:直接从头到尾遍历链表存储节 ...
- 剑指offer —— 从尾到头打印链表
1.问题:输入一个链表,从尾到头打印链表每个节点的值. /** * public class ListNode { * int val; * ListNode next = null; * * Lis ...
- 用js刷剑指offer(从尾到头打印链表)
题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = nu ...
- [剑指Offer]6-从尾到头打印链表
典型的后进先出,可以借助栈,也可以使用递归. 考虑到若链表过长递归可能造成函数调用栈溢出,所以使用栈更好. 注意stack无遍历操作,全部用push(),pop(),top()完成. 以下创建列表胡乱 ...
- 剑指Offer-3.从尾到头打印链表(C++/Java)
题目: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 分析: 很简单的一道题,其实也就是从尾到头打印链表,题目要求返回ArrayList,其实也就是一个数组. 可以将链表中的元素全部 ...
- 剑指Offer_6_从尾到头打印链表
题目描述 输入应该链表的头节点 , 从尾到头反过来打印出每个节点的值.链表定义如下 : typedef struct ListNode { int m_nKey ; ListNode * ...
- 剑指offer--18.从尾到头打印链表
递归,逐个加到后面 ------------------------------------------------------------------------------ 时间限制:1秒 空间限 ...
随机推荐
- RHCSA 复习
1.用户 # -->当前用户为root用户 $ -->当前用户为普通用户 [root@fafa ~]# su - 用户 ----切换用户 2.查看.修改主机名: ***保存在/etc/ ...
- Deep Neural Networks for YouTube Recommendations YouTube的经典推荐框架
https://zhuanlan.zhihu.com/p/52169807 王喆大佬的讲解
- 一致性HASH算法在分布式应用场景使用
其实不管redis还好,Mysql也好 这种数据存储介质,在分布式场景中都存在共同问题:即集群场景下服务路由.比如redis集群场景下,原本我们分3主3从部署.但万一有一天出现访问量暴增或其中一台机器 ...
- 在.NET Core中使用Channel(一)
我最近一直在熟悉.net Core中引入的新Channel<T>类型.我想在它第一次发布的时候我了解过它,但是有关文章非常非常少,我不能理解它们与其他队列有什么不同. 在使用了一段时间后, ...
- 壁球小游戏详解(附有源码.cpp)
1.在python中安装pygame 2.将下列源码复制过去,运行. #引用 import pygame, sys #初始化 pygame.init() size = width, height = ...
- 机器学习算法-PCA降维技术
机器学习算法-PCA降维 一.引言 在实际的数据分析问题中我们遇到的问题通常有较高维数的特征,在进行实际的数据分析的时候,我们并不会将所有的特征都用于算法的训练,而是挑选出我们认为可能对目标有影响的特 ...
- python模块详解 | shutil
简介: shutil是python的一个内置模块,提供了许多关于文件和文件集合的高级操作,特别提供文件夹与文件操作.归档操作了支持文件复制和删除的功能. 文件夹与文件操作: copyfileobj(f ...
- Ubuntu_Gedit配置
Ubuntu_Gedit配置 为了换Ubuntu的时候能够更加方便,不用再用手重新打一遍代码,丢几个Gedit配置-- External Tools gdb compile (F2) #!/bin/s ...
- 【Spring】Spring的事务管理 - 2、声明式事务管理(实现基于XML、Annotation的方式。)
声明式事务管理 文章目录 声明式事务管理 基于XML方式的声明式事务 基于Annotation方式的声明式事务 简单记录 - 简单记录-Java EE企业级应用开发教程(Spring+Spring M ...
- web测试误区:浏览器后退键退出系统会话失效
通过最近测试的项目,认识到实际:浏览器后退键退出系统,会话仍旧有效.打破了之前认为浏览器后退键就会退出系统登录的认知. 一,了解Cookie和Session的作用,具体来说cookie机制采用的是在客 ...