【LeetCode】剑指 Offer 06. 从尾到头打印链表 p58 -- Java Version

news2024/9/29 17:22:36

题目链接: https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/

1. 题目介绍(06. 从尾到头打印链表)

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

【测试用例】:
示例 1:

输入:head = [1,3,2]
输出:[2,3,1]

【条件约束】:

0 <= 链表长度 <= 10000

2. 题解

2.1 辅助栈(后进先出)-- O(n)

时间复杂度:O(n),空间复杂度:O(n)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
        // 1. 创建一个栈用来从前向后存储链表
        Stack<ListNode> stack = new Stack<>();
        // 2. 创建一个ListNode对象,指向head节点
        ListNode node = head;

        // 3. 将链表节点依次压栈
        while (node != null){
            stack.push(node);
            // System.out.println(node.val);
            node = node.next;
        }
        // 4. 创建一个int数组,记录从后向前弹出的链表节点值
        int[] arr = new int[stack.size()];

        // 5. 弹出并将栈内数据存入数组
       for (int i = 0; i < arr.length; i++){
           arr[i] = stack.pop().val;
       }
        // 6. 循环结束,返回数组
        return arr;
    }
}

在这里插入图片描述

2.2 递归 – O(n)

时间复杂度:O(n),空间复杂度:O(n)

代码来自于StackOverflow~在面试题06. 从尾到头打印链表中的Comment.

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    // 1. 定义数组,用于后续的返回
    int[] res;
    public int[] reversePrint(ListNode head) {
        // 2. 递归调用
        backtrack(head,0);
        // 6. 返回最终结果
        return res;
    }

    public int backtrack(ListNode node, int length){
        // 3. 如果当前节点为null,说明走到了最后,创建数组
        if(node==null){
            res = new int[length];
            return 0;
        }
        int index = backtrack(node.next,length+1);
        // 4. 递归到最深层后,依次返回并赋值
        res[index] = node.val;
        // 5. 返回索引+1,用于移动当前数组下标
        return index+1;
    }
}

在这里插入图片描述

2.3 两次暴力遍历 – O(n)

时间复杂度:O(n),空间复杂度:O(n)

代码参考于 TJ. xiong 的 剑指 Offer 06. 从尾到头打印链表.

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
        // 1. 创建一个ArrayList集合
        ArrayList<Integer> integers = new ArrayList<>();
        // 2. 循环遍历,将链表节点值加入集合
        while (head != null) {
            integers.add(head.val);
            head = head.next;
        }
        // 3. 创建一个数组
        int[] ints = new int[integers.size()];
        // 4. 循环遍历,将ArrayList中的数据倒序存入int数组中
        for (int i = 0; i < ints.length; i++) {
            ints [i] = integers.get(ints.length - 1 - i);
        }
        // 5. 循环结束,返回数组
        return ints;
    }    
}

在这里插入图片描述

3. 思考

虽然三种方法的时间复杂度和空间复杂度都是O(n),但是还是比较推荐使用栈(Stack)来实现。使用递归会存在一个问题,那就是:当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。

4. 参考资料

[1] Java Stack 类
[2] 面试题06. 从尾到头打印链表
[3] 剑指 Offer 06. 从尾到头打印链表

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

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

相关文章

信息系统基本知识1

文章目录导论信息信息的定义:信息的特征信息分类系统定义&#xff1a;系统的组成:两种基本模式系统的特征信息系统定义信息系统的概念用户角度系统角度技术角度企业管理角度管理信息系统广义理解狭义理解信息系统工程定义信息系统的结构信息系统的功能信息系统的分类IS中人的作…

【并发编程】【3】Java线程 创建线程与线程运行

并发编程 3.Java线程 本章内容 创建和运行线程 查看线程 线程 API 线程状态 3.1 创建和运行线程 方法一&#xff0c;直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务} }; // 启动线程 t.start();例如&#xff1a; // 构…

程序员必备的软技能-金字塔原理拆解

前言 日常工作中&#xff0c;常常因为思维、表达方式不对产生不想要的结果&#xff1a; 写了一个小时的周报&#xff0c;领导却不满意&#xff1f;跟团队讲了半天自己的想法&#xff0c;可别人就是没理解&#xff1f;看了很多知识、信息&#xff0c;却一点也没记住&#xff1…

【分享】如何通过集简云将ChatGPT人工智能接入到您的抖音中?

ChatGPT是一款非常强大的人工智能产品&#xff0c;可以有创造性的回复和创作文字&#xff0c;图片&#xff0c;适用于很多办公场景。这篇文章将介绍如何将ChatGPT接入到我们的抖音中。 在集简云中的ChatGPT应用 目前集简云提供了两个ChatGPT应用: OpenAI(ChatGPT&#xff09;…

OpenCV实战(11)——形态学变换详解

OpenCV实战&#xff08;11&#xff09;——形态学变换详解0. 前言1. 腐蚀和膨胀运算1.1 腐蚀和膨胀基础1.2 使用形态学滤波器执行图像腐蚀和膨胀运算2. 开运算和闭运算2.1 使用形态学滤波器执行图像开运算和闭运算3. 形态学变换应用3.1 使用形态学滤波器检测边缘3.2 使用形态学…

跨平台应用开发进阶(五十五):uni-app 实现内容分享

文章目录一、前言二、系统分享组件三、uniShare SDK调用四、拓展阅读一、前言 APP开发过程中&#xff0c;需要实现分享功能。 常用的分享实现方法包括&#xff1a; 系统分享组件&#xff1b;uniShare SDK调用&#xff1b; 二、系统分享组件 uni.shareWithSystem(OBJECT)调…

jvisualvm安装Visual GC插件以及连接远程应用监控jvm【杭州多测师_王sir】【杭州多测师】...

一)jvisualvm工具安装Visual GC插件 1、在本地jdk安装路径找到jvisualvm.exe双击打开 2、选择工具-插件-勾选visual GC 如果显示重试&#xff0c;先点击设置-编辑-选择你本地对应的JDK版本的URL&#xff1a;https://visualvm.github.io/pluginscenters.html 3、点击远程-添加远…

CSS系统学习总结

目录 CSS边框 CSS背景 CSS3渐变 线性渐变&#xff08;Linear Gradients&#xff09;- 向下/向上/向左/向右/对角方向 语法 线性渐变&#xff08;从上到下&#xff09; 线性渐变&#xff08;从左到右&#xff09; 线性渐变&#xff08;对角&#xff09; 使用角度 使用多…

博视像元获近5000万元融资,主攻半导体前道及锂电高端部件供应

这两年各大车企与电池厂商都在快速新建产能&#xff0c;尤其上游原材料成本大增&#xff0c;反映到产业链上巨头都在寻求增效&#xff0c;高端制造技术投入也大幅增长。比如这家&#xff0c;高端工业相机提供商「博视像元」近期宣布完成近5000万的天使加轮融资&#xff0c;投资…

指针——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰学习的内容是指针&#xff0c;这次只会讲一些很简单的知识点&#xff0c;更详细的指针知识会在以后的博客中逐步剖析清楚&#xff0c;那么现在&#xff0c;就让我们进入指针的世界吧 指针是什么 指针和指针类型 野指…

Spring 如何解决循环依赖?

什么是循环依赖 &#xff1f; 一个或多个对象之间存在直接或间接的依赖关系&#xff0c;这种依赖关系构成一个环形调用&#xff0c;有下面 3 种方式。 我们看一个简单的 Demo&#xff0c;对标“情况 2”。 Service public class Louzai1 {Autowiredprivate Louzai2 louzai2;…

基于OpenAI搭建自己的ChatGPT环境1

基于OpenAI搭建自己的ChatGPT环境1基于OpenAI搭建自己的ChatGPT环境注册账号生成访问密钥创建虚拟环境安装openai模块环境体验笔者初次接触人工智能领域&#xff0c;文章中错误的地方还望各位大佬指正&#xff01; 基于OpenAI搭建自己的ChatGPT环境 ChatGPT是OpenAI研发的人机…

Java基础之网络编程介绍详尽笔记

目录初识网络编程网络传输模型网络传输协议UDPUDP通信程序UDP的三种通信方式TCPTCP通信协议TCP的三次握手TCP的四次挥手初识网络编程 网络编程三要素 IP 设备在网络中的地址&#xff0c;是唯一的标识。 端口号 应用程序在设备中唯一的标识。 协议 数据在网络中传输的规则&…

童年回忆--扫雷(包括标记功能和递归展开)--万字讲解让你学会扫雷制作

魔王的介绍&#xff1a;&#x1f636;‍&#x1f32b;️一名双非本科大一小白。魔王的目标&#xff1a;&#x1f92f;努力赶上周围卷王的脚步。魔王的主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王.&#x1f525;&#x1f525;&#x1f525; ❤️‍&#x1…

第九章:创建用户和用户权限

Windows&#xff1a;创建用户&#xff1a;第一种方法创建用户&#xff1a;先点右上角的工具&#xff0c;然后点击AD用户和计算机双击skills.com打开目录&#xff0c;再双击Users&#xff0c;进入文件夹中在右框中右击空白处&#xff0c;新建用户填充好用户信息后点击下一步然后…

Sophos防火墙日志管理

每天&#xff0c;Sophos防火墙都会生成大量的syslog数据&#xff0c;很难独自监控它们。借助EventLog Analyzer&#xff0c;您可以存档系统日志以满足合规性要求&#xff0c;并进行彻底的取证调查&#xff0c;以在发生任何问题&#xff08;例如网络入侵&#xff09;时获得宝贵的…

MySQL用户管理

文章目录MySQL用户管理用户用户信息创建用户修改用户密码删除用户数据库的权限MySQL中的权限给用户授权回收权限MySQL用户管理 与Linux操作系统类似&#xff0c;MySQL中也有超级用户和普通用户之分。如果一个用户只需要访问MySQL中的某一个数据库&#xff0c;甚至数据库中的某…

Unity 资源插件 Agents Navigation 3.1.1.unitypackage

Unity 插件 Agents Navigation 3.1.1.unitypackage 描述 这个软件包包括高性能、模块化和可扩展的代理导航。它是以 DOTS 为核心开发的&#xff0c;因此充分利用了 Unity 的最新技术栈&#xff0c;如 SIMD 数学、Jobs、Burst 编译器和 EntityComponentSystem。此外&#xff0c;…

【ASP.NET】原生JavaScript加Asp.net实现多图片上传

记录一下&#xff0c;Javascript加asp.net实现多文件上传的方法。首先看一下要实现的功能&#xff0c;图片比文字描述更直观。 一、前台代码 前台代码代码分为三个部分&#xff0c;一是HTML代码&#xff0c;二是Style样式代码&#xff0c;三是Javascript代码。 1.html代码 …

亿级高并发电商项目-- 实战篇 --万达商城项目 八(安装FastDFS、安装Nginx、文件服务模块、文件上传功能、商品功能与秒杀商品等功能)

专栏&#xff1a;高并发---分布式项目 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支…