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

这篇具有很好参考价值的文章主要介绍了【九章斩题录】从尾到头打印链表(JZ6)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    【九章斩题录】从尾到头打印链表(JZ6) 精品题解 🔥 《九章斩题录》  👈 猛戳订阅

目录

JZ6 - 从尾到头打印链表

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

「 法二 」递归大法

「 法三 」栈


JZ6 - 从尾到头打印链表

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

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

💭 示例:

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

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

✅ 模板:C语言


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

" 简单粗暴 "

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

这全都归功于 reverse 接口,时间复杂度为 ,空间复杂度为 。

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;
    }
};

「 法二 」递归大法

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

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

递归三段式:

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

时间复杂度为 ,空间复杂度为 。

💬 代码演示: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)。然后再创建一个数组用来接收占栈顶元素,然后再依次出栈直到栈为空。举个例子,链中现有元素  :

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

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

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

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

💬 代码演示: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);                   // 返回数组
    }
};

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

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   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.文章来源地址https://www.toymoban.com/news/detail-489253.html

到了这里,关于【九章斩题录】从尾到头打印链表(JZ6)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 剑指 Offer 06. 从尾到头打印链表

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸剑指 Offer   📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同

    2024年02月08日
    浏览(43)
  • Leetcode-每日一题【剑指 Offer 06. 从尾到头打印链表】

    输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入: head = [1,3,2] 输出: [2,3,1] 限制: 0 = 链表长度 = 10000 1.题目要求我们从尾到头反过来返回每个节点的值,这道题我们可以用栈去解决,但是我们还可以采用另一种方法。就是我们可以

    2024年02月13日
    浏览(36)
  • 【Leetcode -1290.二进制链表转整数 -剑指Offer 06.从尾到头打印链表】

    题目:给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的十进制值 。 示例 1: 输入:head = [1, 0, 1] 输出:5 解释:二进制数(101) 转化为十进制数(5) 示例 2: 输入:head = [0] 输出:

    2023年04月26日
    浏览(47)
  • 数据结构学习 jz29 顺时针打印矩阵

    :模拟 简单题做了超过40分钟 调了很久 不好  我自己做的。 xy_t: 记录xy的方向,往右走,往下走,往左走,往上走 t控制方向 isx:         true:轮到x方向动         false:轮到y方向动 n_res m_res:         n_res:还没走过的行数(x方向)         m_res:还没走

    2024年01月17日
    浏览(37)
  • JZ32 从上往下打印二叉树(Java)

    题目地址:从上往下打印二叉树_牛客题霸_牛客网 题目回顾: 不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印,跳过),请你将打印的结果存放到一个数组里面,返回。 解

    2024年02月13日
    浏览(38)
  • 剑指offer(C++)-JZ29:顺时针打印矩阵(算法-模拟)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 则依次打印出数字 数据范围: 0 = matrix.length = 100 0 = ma

    2024年02月10日
    浏览(43)
  • 【力扣-JZ22】链表中倒数第k个结点

    🖊作者 : Djx_hmbb 📘专栏 : 数据结构 😆今日分享 : \\\"把手插进米堆的原因 \\\" : 因为米堆类似于高密度的流体,会给人的手带来较大的压强,这种压强促进静脉血回流,会让人感到生理上的舒服。 【力扣-JZ22】 : 先计算链表有多长,然后length–,找到第k个指针 : fast指针先走k步,然后

    2024年02月01日
    浏览(65)
  • Java实现创建链表与打印链表元素(可作为模板)

    1、通过数组元素值,构造一个单向链表; 2、将链表元素以数组的形式打印出来,如“[1, 2, 3, 4]”

    2024年02月05日
    浏览(40)
  • 【数据结构】数组和字符串(八):稀疏矩阵的链接存储:十字链表的创建、插入元素、遍历打印(按行、按列、打印矩阵)、销毁

    【数据结构】数组和字符串(一):矩阵的数组表示   矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造

    2024年02月06日
    浏览(55)
  • 数据结构_链表_双向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)

    版本: 2024年4月26日 V1.0 发布于博客园 目录 目录 双向循环链表公式 初始化双向循环链表 构建双向循环链表结点 创建一个空链表(仅头结点) 创建一个新结点 插入数据 头插 中插 尾插 删除数据 头删 中删 尾删 查询打印数据 遍历打印 测试 测试结果: 完整代码 DoubleCirLList.h

    2024年04月27日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包