【剑指offer】4.从尾到头打印链表(java)

news2024/9/23 15:26:43

文章目录

  • 从尾到头打印链表
    • 描述
    • 示例1
    • 示例2
    • 思路
    • 完整代码

从尾到头打印链表

描述

输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。

如输入{1,2,3}的链表如下图:

img

返回一个数组为[3,2,1]

0 <= 链表长度 <= 10000

示例1

输入:

{1,2,3}

返回值:

[3,2,1]

示例2

输入:

{67,0,24,58}

返回值:

[58,24,0,67]

思路

看一下链表的结构

public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
    	this.val = val;
    }
}

可以看到,其只能从链表的头部遍历到尾部

要想实现逆序输出,可以使用栈这个数据结构,因为其特点就是后进先出

public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    Stack<Integer> stack = new Stack<>();	//创建空栈
    while (listNode != null) {		//将链表元素压入栈中
        stack.push(listNode.val);
        listNode = listNode.next;
    }
    ArrayList<Integer> newList = new ArrayList<>();		//创建返回的列表
    if (!stack.empty()) {	//空栈则返回空列表
        for (int i = stack.size() - 1; i >= 0; i--) {
            newList.add(stack.pop());
        }
    }
    return newList;
}

这段代码中最令人疑惑的就是遍历栈的循环条件部分:

for (int i = stack.size() - 1; i >= 0; i--)

可以看到循环体内的pop操作似乎和i的值无关,那么for循环条件判断应该就是用来判断循环次数,但是当把循环的i从0开始时,答案就会报错:

for (int i = 0; i <= stack.size() - 1; i++)

我也不太清楚这是什么原理,然后后面我又尝试使用迭代器进行遍历:

Iterator<Integer> iterator = stack.iterator();
while (iterator.hasNext()) {
    int element = iterator.next();
    newList.add(element);
}

但是遍历的结果居然是从栈底开始取元素,我也不清楚哪里出了问题。

然后看了别人的解法发现,实际上ArrayList这个结构有一个方法add,查看api帮助文档:

在这里插入图片描述

这实际上很好的满足了题目要求的条件,因为链表是正向访问的,所以只要将每个访问的元素都存在第一个位置,那么新来的元素就会将旧的元素往后面挤,从而实现最新访问的链表元素会存在ArrayList的第一位,而最早访问的链表元素是存在ArrayList的最后一位,从而实现逆序输出

public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    ArrayList<Integer> newList = new ArrayList<>();
    while (listNode != null) {
        newList.add(0,listNode.val);
        listNode = listNode.next;
    }
    return newList;
}

这种方法比使用stack更简洁明了,而且不会出现那些遍历栈的问题。

完整代码

import java.util.*;
/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> newList = new ArrayList<>();
        while (listNode != null) {
            newList.add(0,listNode.val);
            listNode = listNode.next;
        }
        return newList;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/732363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享 Eclipse 常用插件(持续更新)

NO1&#xff1a; sts 点评&#xff1a;不用多说了&#xff0c;springboot/springcloud 家族必备插件 NO2&#xff1a;Eclipse Color Theme 点评&#xff1a;是时候换个主题了&#xff01; 总有一款适合你&#xff01; 这里贴上按照步骤&#xff1a; 通过 help-> Eclips…

7.5_2散列查找(下)

不同于拉链法&#xff0c;他是实实在在存储在这个位置&#xff0c;而不是用指针去指向。 发生冲突时&#xff0c;每次既可以往后探测相邻的下一个单元是否为空。 发生冲突了 序号7也有其他元素了&#xff0c;所以只能存到序号为8的位置上 也就是或线性探测法如果发生冲突了&am…

C++多线程学习(十二、特殊的原子类型atomic_flag,自旋锁)

目录 atomic_flag 自旋锁 自旋锁与互斥锁的不同 1. 等待方式不同&#xff1a; 2. 资源消耗不同&#xff1a; 3. 适用场景不同&#xff1a; 简单案例 其他的原子类型是可以通过is_lock_free()来判定是否无锁 atomic_flag atomic_flag&#xff1a;是无锁的 atomic_flag的…

25岁的我被辞了转行做软件测试,5个月靠体系化自学“跳进”阿里

前言 大学学的是物流管理&#xff0c;毕业之后到现在的两年时间内也是做的物流相关的岗位&#xff0c;但是现在想做个有技术含量的工作&#xff0c;所以想学软件测试&#xff0c;大学的时候学过VB&#xff0c;前几天自己网上看了讲软件测试入门的视频觉得还能听懂所以我说一下…

Kubernetes_KubeProxy_Service找到Pod与DNS解析Service/Pod

文章目录 前言一、Service找到Pod(Iptables)二、Service找到Pod(IPVS)2.1 IPVS模式原理2.2 IPVS模式实践修改为 IPVS 模式 之前修改为 IPVS 模式之中修改为 IPVS 模式之后 三、Service和Pod的DNS域名尾声 前言 一、Service找到Pod(Iptables) 在前面的文章中&#xff0c;我们已…

【动态规划算法】第十题:174.地下城游戏

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你…

Java中如何定义一个线程工厂?

线程工厂官方文档&#xff1a; 在Java中&#xff0c;可以通过实现ThreadFactory接口来定义一个线程工厂。线程工厂用于创建新的线程对象&#xff0c;并可以自定义线程的属性、命名规则等。 下面是一个简单的示例代码&#xff0c;展示如何定义一个线程工厂&#xff1a; import…

路径规划算法:基于学校优化优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于学校优化优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于学校优化优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

抖音账号矩阵系统|源码|开源代码独立部署难度-开发者分享

抖音账号矩阵系统&#xff0c;短视频账号矩阵系统源码&#xff0c; 短视频矩阵是一种常见的视频编码标准&#xff0c;它通过将视频分成多个小块并对每个小块进行压缩来实现高效的视频传输。短视频多账号矩阵系统&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员…

学生信息管理系统——C语言版

C语言版学生信息管理系统 一&#xff0c;开发环境 操作系统&#xff1a;windows10, windows11, linux, mac等。开发工具&#xff1a;Qt, vscode, visual studio等开发语言&#xff1a;c语言 二&#xff0c;功能需求 用户界面: 提供一个简洁的文本界面&#xff0c;用户可以通…

EA编写的十大注意事项:避免常见的错误和陷阱

EA编写是一项复杂而有挑战性的任务&#xff0c;需要投资者具备一定的编程技能及丰富的交易经验。下面我将分享EA编写过程中的十大注意事项&#xff0c;以及如何避免常见的错误和陷阱。 设定明确的目标和策略 在编写EA之前&#xff0c;一定要明确交易目标和策略。这包括交易工具…

从OVF矢量场文件中获取磁斯格明子的位置和半径的粗略方法(trace skyrmion)

文章目录 前言一、使用oommf的avf2odt命令行程序获取斯格明子中心位置的示例二、当磁体系的单个xy平面层仅有一个斯格明子的情况1.读取所有磁化文件中的指定磁化分量2.筛选出每一个xy平面层中位于磁化分量阈值范围内的单元格3.计算组成磁结构的所有单元格的平均坐标和平均距离 …

今年想考CISP,速看这篇

关键词&#xff1a;CISP考试&#xff0c;CISP认证&#xff0c;CISP报名条件&#xff0c;CISP培训&#xff0c;CISP考试费用&#xff0c;CISP考试大纲 注册信息安全专业人员&#xff08;Certified Information Security Professional&#xff0c;简称“CISP"&#xff09;&…

如何处理Long类型精度丢失问题?

如何处理Long类型精度丢失问题?_拒绝画大饼的博客-CSDN博客 解决问题&#xff1a;long型数据精度丢失_long精度丢失_YOLO小蜗的博客-CSDN博客 原因分析 通过观察控制台输出的SQL发现页面传递过来的员工id的值和数据库中的id值不一致&#xff0c;这是怎么回事呢&#xff1f; 在…

Node中的模块引擎EJS模块渲染

1.导入 const ejsrequire("ejs") 2.声明数组 const group["张三","李四","王二","麻子"] 3.EJS实现 let resultejs.render(<ul> <% group.forEach(item>{ %> <li><%item%></li> <% }) …

ionic实现滑动的三种方式

ionic实现滑动的三种方式 在移动端受屏幕大小所限&#xff0c;展示内容很多的时候&#xff0c;就要使部分区域进行滑动。本文展示项目中所有到的几种方式&#xff0c;大家可以看自己的需求选择合适的滑动方式。实现滑动的基本原理&#xff0c;有两个容器A、B,假如A在外层&#…

[element-ui] el-descriptions站位,换行用法

使用element-ui组件el-descriptions element-ui组件el-descriptions官方文档 需要将el-descriptions-item换行用法&#xff1a;使用span &#xff08;1&#xff09;span 代表占位&#xff0c;当span 的值大于 column的值&#xff0c;就会自动换一行 &#xff08;2&#xff0…

通过正则表达式删除包含某个字符串的一整行

正则表达式为&#xff1a;^.*YourString.*\R 以下为NotePad编辑器的操作步骤&#xff1a; 1、CtrlH打开文本编辑器的替换功能 2、将上面的正则表达式复制到"查找目标"文本框 3、"替换为"文本框置为空 4、勾选“正则表达式” 5、点击替换或者全部替换

数据结构-ArrayList

目录 线性表 顺序表 ArrayList ArrayList的使用 ArrayList的构造方法 ArrayList的常用方法 ArrayList的遍历 实现简单的ArrayList 洗牌算法 删除公共字符串问题 杨辉三角 线性表 线性表是n个具有相同特性的数据元素的有限序列.线性表是一种在实际中广泛使用的数据结…

【标准】国家标准GB7713-87(科学论文编写格式)

目 录 1 引言 2 定义 2.1 科学技术报告 2.2 学位论文 2.3 学术论文 3 编写要求 4 编写格式 5 前置部分 5.1 封面 5.2 封二 5.3 题名页 5.4 变异本 5.5 题名 5.6 序或前言 5.7 摘要 5.8 关键词 5.9 目次页 6 主体部分 6.1 格式 6.2 序号 6.3 引言(或绪论)…