【九章斩题录】从尾到头打印链表(JZ6)

news2024/11/20 16:33:31

     精品题解 🔥 《九章斩题录》  👈 猛戳订阅

目录

JZ6 - 从尾到头打印链表

「 法一 」链表元素存入数组后再反转

「 法二 」递归大法

「 法三 」栈


JZ6 - 从尾到头打印链表

📚 题目:输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。如输入 \left \{ 1,2,3 \right \} ,则返回数组  [3,2,1] 。

  • \color{} 0\leq ListLength\leq 10000

💭 示例:

输入:{1,2,3}
返回:[3,2,1]

输入:{67,0,24,58}
返回:[58,24,0,67]

✅ 模板:C语言


「 法一 」链表元素存入数组后再反转

" 简单粗暴 "

💡思路:最容易想到的方法,用 reverse 接口。我们直接遍历整个链表,将元素存入数组,然后直接调 reverse 接口反转数组,最后返回该数组即可。

这全都归功于 reverse 接口,时间复杂度为 O(n),空间复杂度为 O(n)

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> vc;
        while (head) {
            vc.push_back(head->val);
            head = head->next;
        }
        // 反转数组
        reverse(vc.begin(), vc.end());

        return vc;
    }
};


「 法二 」递归大法

" 递归到达底层后往上回溯,正好逆序。"

💡 思路:利用递归到达底层之后才会往上回溯的特性,我们可以使用递归遍历链表。

递归三段式:

① 终止条件:递归进入链表尾,即节点为空节点时结束递归。
② 返回的值:每次返回子问题之后的全部输出。
③ 本级任务:每级子任务递归地进入下一级,等下一级的子问题输出数组返回时,将自己的节点值添加在数组末尾。

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

💬 代码演示:C++

class Solution {
public:
    /* 递归函数 */
    void rec(ListNode* head, vector<int>& res) {
        if (head) {  
            rec(head->next, res);     // 往链表深处遍历
            res.push_back(head->val); // 再插入数组时即为逆序
        }
    }
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> vc;
        rec(head, vc);

        return vc;
    }
};

Step1:从头节点开始往后递归进入每一个节点。
Step2:遇到尾节点后开始返回,每次返回依次添加一个值进入输出数组。
Step3:直到递归返回表头。


「 法三 」栈

" 既有反转思想,阁下何不用栈处理之?" 

💡 思路:递归本质上就是用栈实现的,所以这里也可以用栈解决,利用栈 "后进先出" 的特性,遍历整链并将元素依次入栈 (push)。然后再创建一个数组用来接收占栈顶元素,然后再依次出栈直到栈为空。举个例子,链中现有元素 \left \{ 1,2,3 \right \} :

① 创建栈和数组,并将链表元素依次入栈。

② 然后再通过 top 取栈顶元素,并将元素存入数组。

③ 然后再 pop 栈顶元素,继续 top 取栈顶元素,直到链表为空。

\left \{ 1,2,3 \right \}\, \overrightarrow{push}\, \, \, (3,2,1)\, \, \, \overrightarrow{push\, back(top),pop}\, \, \, [3,2,1]
\color{}R:array

如此一来数组中存的元素就是 3,2,1 了,返回该数组即可。时间复杂度为 O(n),空间复杂度为 O(n)

💬 代码演示:C++

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> vc;                // 存储返回值的数组
        stack<int> st;                 // 设栈

        /* 遍历链表 */
        while (head != nullptr) {
            st.push(head->val);        // 元素依次推栈
            head = head->next;         // 指针后移
        }

        /* 取出元素 */
        while (!st.empty()) {          // 如果栈不为空
            vc.push_back(st.top());    // 取对顶元素插进数组
            st.pop();                  // 弹栈
        }

        return( vc);                   // 返回数组
    }
};

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2023.
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

C++reference[EB/OL]. []. http://www.cplusplus.com/reference/.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

牛客网. 剑指offer 题解 [EB/OL]. []. https://www.nowcoder.com/exam/oj/ta?tpId=13.

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

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

相关文章

苹果iOS 17新功能:重置密码 72 小时内可使用旧密码再次重置

一些用户可能会遇到&#xff0c;在修改了 iPhone 密码之后&#xff0c;突然忘记新密码的情况。现在苹果在 iOS 17 中加入了新的解决方案&#xff1a;在重置密码的 72 小时之内&#xff0c;如果用户不小心忘记了新设置的密码&#xff0c;仍然可以使用旧密码进行再次重置。 在重…

TS系列之工具类型Partial、Required、Pick、Record详解,示例

TS系列之工具类型Partial、Required、Pick、Record详解&#xff0c;示例 文章目录 前言一、Partial<Type>二、Required<Type>三、Pick<Type, Keys>四、Record<Keys, Type>总结 前言 本片文章主要利用上一篇所学的keyof做一个延申与扩展的学习。在Type…

OpenGaussDB2.0.1

目录 1. GaussDB版本2. OpenGaussDB介绍3. 单节点安装3.1 环境配置3.2 安装 4. 远程连接设置 1. GaussDB版本 GaussDB的版本&#xff1a; GaussDB 100&#xff1a;目前暂不发布&#xff0c;公司合作伙伴需向华为提交申请&#xff08;GaussDB 100 将在 2020 年被正式命名为 Gaus…

Redis入门 - 3种特殊数据类型

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis入门 - 3种特殊数据类型 | CoderMast编程桅杆https://www.codermast.com/database/redis/three-special-datatype.html 在我们平常的业务中基本只会使用到Redis的基本数据类型&#xff08;String、List、Hash、Set、S…

浅谈.NET语言开发应用领域

.NET语言是一种跨平台的开发框架&#xff0c;适用于各种应用程序的开发。以下是一些常见的.NET语言开发应用领域&#xff1a; 桌面应用程序开发&#xff1a;使用.NET框架开发的桌面应用程序可以在Windows操作系统上运行&#xff0c;包括Windows Forms和WPF。这些应用程序可以用…

CentOS开机报错““error can‘t find command ‘:‘“处理方法

CentOS开机报错"error cant find command :"处理方法 本文为故障描述和问题记录。converterP2V迁移CentOS7到虚拟机&#xff0c;开机报错"error can’t find command ‘:’"的处理方法。 本文为CentOS7的操作记录&#xff0c;其他版本可以参考&#xff0c;…

CASAIM光学彩色三维扫描仪助力文物艺术品三维数字化3D打印

文物艺术品数字化&#xff0c;实际上是一种文物艺术品信息的记录方式&#xff0c;除了运用视频、照片、录音等多媒体形式将某些文物进行记录外&#xff0c;文物艺术品数字化主要是指针对有形文化遗产采用非接触式扫描得到的三维数字化记录&#xff0c;通过实景三维建模&#xf…

GitHub 上传自己的项目

文章目录 前言一、步骤1.GitHub 创建项目2.Git 上传本地项目到 GitHub3.Git 命令整理 总结 前言 不附 Demo 连接的博客不是好博客&#xff0c;所以我们要做个乐于助人&#xff0c;有责任心的人&#xff0c;这篇文章手把手教你如何在 GitHub 上传自己的项目&#xff0c; 一、步…

【OpenMMLab AI实战营二期笔记】第五天 MMPretrain代码课

1.环境安装 conda activate mmpre # 激活创建好的环境,确保安装好pytorch,可以使用gpu git clone https://github.com/open-mmlab/mmpretrain.git # 下载mmpre源码 cd mmpretrain # 进入mmpretrian目录 pip install openmim # 安装管理工具 mim install -e ".[multimodal…

JAVA开发运维(系统上到生产环境准备工作)

一、前言 java项目在开发环境开发完成&#xff0c;在测试环境测试没有问题后&#xff0c;就需要发布到生产环境&#xff0c;如果系统是对公众的&#xff0c;那就需要很多工作了。比如服务器申请&#xff0c;域名申请&#xff0c;渗透测试&#xff0c;漏洞扫描&#xff0c;公网…

第二章(第二节):导数与微分

1.导数与微分 1.导数概念 设曲线 L 的方程 y=f(x),a ≤ x ≤ b,x0 ∈ (a, b),在曲线 L 上的点 M0(x0, y0) 附近任取一点 M(x0 + Δx, y0 + Δy),过 M0 与 M 作曲线的割线M~0~M,的斜率为:当 x→x0 时,点 M 沿着曲线 L 趋向 M0,与此同时,割线 M0M 趋向一个极限位置 M0T…

想要转行的一定要看软件测试发展简史+学习路线

迄今为止&#xff0c;软件测试的发展一共经历了五个重要时期&#xff1a; 调试为主 20世纪50年代&#xff0c;计算机刚诞生不久&#xff0c;只有科学家级别的人才会去编程&#xff0c;需求和程序本身也远远没有现在这么复杂多变&#xff0c;相当于开发人员一人承担需求分析&am…

idea设置注释模板

目录 设置注释文件模板设置模板 设置注释文件模板 Ctrl Alt S 打开设置&#xff0c;Editor - File and Code Templates 选择class、interface、enum根据自己需要选择需要添加注释的文件&#xff0c;依次添加如下配置内容 /**1. ClassName ${NAME}2. Description TODO3. Aut…

BUUCTF Unencode 1

题目描述&#xff1a; 密文&#xff1a; 89FQA9WMD<V1A<V1S83DY.#<W3$Q,2TM]解题思路&#xff1a; 1、观察密文&#xff0c;尝试Base85、Base91等编码&#xff0c;均失败。 2、结合题目&#xff0c;联想到UUencode编码&#xff0c;尝试后成功&#xff0c;得到flag。 …

驱动LSM6DS3TR-C实现高效运动检测与数据采集(5)----上报匿名上位机实现可视化

概述 lsm6ds3trc包含三轴陀螺仪与三轴加速度计。 姿态有多种数学表示方式&#xff0c;常见的是四元数&#xff0c;欧拉角&#xff0c;矩阵和轴角。他们各自有其自身的优点&#xff0c;在不同的领域使用不同的表示方式。在四轴飞行器中使用到了四元数和欧拉角。 姿态解算选用的…

SpringBoot配置多数据源

SpringBoot配置多数据源 最近在做一个SpringBoot项目时需要关联两个数据库,于是乎我就研究了下关于springboot的多数据源配置,记录配置过程,分享一下 一、基础配置 (这里只展示主要配置) JDK1.8springBoot2.3.4.RELEASEmybatis2.1.0mysql-connector-java 8.0.21maven仓…

知乎家居产品种草营销怎么做?

近年来&#xff0c;家居产品种草营销已经成为了一种新型营销方式。知乎作为全球最大的中文问答社区&#xff0c;拥有着海量的用户和优质内容&#xff0c;逐渐成为了家居产品种草营销中不可忽视的平台。那么&#xff0c;在这个平台上如何进行家居产品种草营销呢&#xff1f;接下…

Python之函数【三】(高阶函数和闭包)

文章目录 前言一、高阶函数二、闭包&#xff08;也称之为&#xff1a;闭包函数&#xff09; 1、浅谈闭包函数 1.1、划重点1.2、注意点2、怎么判断是不是闭包函数呢&#xff1f; 2.1、那接下来&#xff0c;我们就细细的拆开解释2.2、对于这个作用域&#xff0c;在JavaSc…

【MySQL数据库基础】

MySQL数据库基础 1. 数据库的操作1.1 显示当前的数据库1.2 创建数据库1.3 使用数据库1.4 删除数据库 2. 常用数据类型2.1整数&#xff08;xxxint&#xff09;2.2日期时间类型2.3字符串型 3. 表的操作3.1 查看表结构3.2 创建表3.3 删除表 1. 数据库的操作 1.1 显示当前的数据库…

Es索引中时间字段是字符串Range查询的正确姿势

文章目录 [toc] 1. 问题2. Es索引的mapping模式2.1 dynamic动态宽松模式&#xff08;动态映射&#xff09;2.2 strict严格模式&#xff08;静态映射&#xff09; 3. text类型和keyword类型的区别3.1 text类型3.2 keyword类型 4.正确姿势5. 总结 1. 问题 由于之前搞了一个使用fl…