(链表) 剑指 Offer 58 - I. 翻转单词顺序 ——【Leetcode每日一题】

news2024/11/24 19:42:59

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

难度:简单

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

示例 1:

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

限制

  • 0 <= 链表长度 <= 10000

💡思路:

法一:递归

要逆序打印链表 1->2->3(3,2,1):

  • 可以先逆序打印链表 2->3(3,2),最后再打印第一个节点 1。
  • 而链表 2->3 可以看成一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。

法二:栈

  • 栈具有后进先出的特点,在遍历链表时将值按顺序放入栈中,最后出栈的顺序即为逆序。
    在这里插入图片描述

法三:头插法

  • 在遍历原始链表时,将当前节点插入新链表的头部,使其成为第一个节点。

为了能将一个节点插入头部,我们引入了一个辅助节点 h0,该节点不存储值,只是为了方便进行插入操作。

(不要辅助节点与第一个节点混起来,第一个节点是链表中第一个真正存储值的节点。)

在这里插入图片描述

🍁代码:(C++、Java)

法一:递归
C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
private:
    vector<int> ans;
public:
    vector<int> reversePrint(ListNode* head) {
        if(head != nullptr){
            reversePrint(head->next);
            ans.push_back(head->val);
        }
        return ans;
    }
};

Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    private ArrayList<Integer> tmp = new ArrayList<>();
    public int[] reversePrint(ListNode head) {
        revList(head);
        int[] ans = new int[tmp.size()];
        for(int i = 0; i < ans.length; i++){
            ans[i] = tmp.get(i);
        }
        return ans;
    }
    void revList(ListNode head){
        if(head != null){
            revList(head.next);
            tmp.add(head.val);
        }
    }
}

法二:栈
C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {   
public:
    vector<int> reversePrint(ListNode* head) {
        stack<int> temp;
        while(head != nullptr){
            temp.push(head->val);
            head = head->next;
        }
        vector<int> ans;
        while(!temp.empty()){
            ans.push_back(temp.top());
            temp.pop();
        }
        return ans;
    }
};

Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
        Stack<Integer> temp = new Stack<>();
        while(head != null){
            temp.add(head.val);
            head = head.next;
        }
        int[] ans = new int[temp.size()];
        for(int i = 0; i < ans.length; i++){
            ans[i] = temp.pop();
        }
        return ans;
    }
}

法三:头插法
C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {   
public:
    vector<int> reversePrint(ListNode* head) {
        ListNode* h0 = new ListNode;
        while(head != nullptr){// 头插法构建逆序链表
            ListNode* temp = head->next;
            head->next = h0->next;
            h0->next = head;
            head = temp;
        }
        head = h0->next;
        vector<int> ans;
        while(head != nullptr){
            ans.push_back(head->val);
            head = head->next;
        }
        return ans;
    }
};

Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
        int cnt = 0;
        ListNode h0 = new ListNode(0);
        while(head != null){// 头插法构建逆序链表
            ListNode temp = head.next;
            head.next = h0.next;
            h0.next = head;
            head = temp;
            cnt++;
        }
        head = h0.next;
        int[] ans = new int[cnt];
        for(int i = 0; i < cnt; i++){
            ans[i] = head.val;
            head = head.next;
        }
        return ans;
    }
}

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),遍历一遍或两遍链表。
  • 空间复杂度 O ( n ) O(n) O(n)法一和法二 额外使用一个栈存储链表中的每个节点;法三 仅使用常量级空间,所以为 O ( 1 ) O(1) O(1)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

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

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

相关文章

自己实现数据结构,有更好的可操作性

https://leetcode.cn/problems/asteroid-collision/ 就是说&#xff0c;非得用人家写的栈不可么 stl 的 stack&#xff0c;没办法随机访问&#xff0c;用 vector 或者再不济数组&#xff0c;就好了&#xff0c;非要用 stl 的&#xff0c;就导致还得有另一个 vector 维护向左走…

多目标灰狼算法(MOGWO)的Matlab代码详细注释及难点解释(佳点集改进初始种群的MOGWO)

目录 一、外部种群Archive机制 二、领导者选择机制 三、多目标灰狼算法运行步骤 四、MOGWO的Matlab部分代码详细注释 五、MOGWO算法难点解释 5.1 网格与膨胀因子 5.2 轮盘赌方法选择每个超立方体概率 为了将灰狼算法应用于多目标优化问题,在灰狼算法中引入外部种群Archi…

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)

目录 1. 返回静态页面 2. 返回非静态页面 2.1 ResponseBody 返回页面内容 2.2 RestController ResponseBody Controller 2.3 示例:实现简单计算的功能 3. 返回JSON对象 3.1 实现登录功能&#xff0c;返回 JSON 对象 4. 请求转发(forward)或请求重定向(redirect) 4.1 请…

Day 63 : 集成学习之 AdaBoosting (1. 带权数据集)

63.1 AdaBoosting基本算法&#xff1a;先从初始训练集训练一个弱学习器&#xff0c;在根据弱学习器的表现对训练样本进行权重调整&#xff0c;经过若干轮之后&#xff0c;将得到一组分类器&#xff0c;将数据输入这组分类器后会得到一个综合且准确的的分类结果。“三个臭皮匠&a…

评论管理功能

后端 bp.get("/comment/list") def comment_list():comments CommentModel.query.order_by(CommentModel.create_time.desc()).all()comment_list []for comment in comments:comment_dict comment.to_dict()comment_list.append(comment_dict)return restful.ok…

Python模块requests基本用法

简介 Python 的 requests 模块是一个流行的第三方库&#xff0c;用于发送HTTP请求。它提供了一组简洁且易于使用的API&#xff0c;使得在Python中进行网络通信变得更加简单和灵活。 目录 1. 基本概念 1.1. HTTP 协议 1.2. GET 请求 1.3. POST 请求 1.4. get 和 post 的区别…

uniapp 小程序 评分组件

效果图&#xff1a; 1、组件&#xff1a;starsRating.vue <template><view class"stars"><image click"btnStars1" class"starsicon" :src"starsObject[0]" mode"widthFix"></image><image c…

Stream API将对象中的某一字段取出转换为list或数组

List<DevicePartMaintain> devicePartMaintainList devicePartMaintainMapper.selectDevicePartMaintainByMitId(mitId);所有id转换为List 要使用Stream流获取devicePartMaintainList中所有的id&#xff0c;您可以使用stream()方法将列表转换为流&#xff0c;然后使用…

从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现

目录 1. 红黑树的引入和简介 2. 红黑树的性质和定义 3. 红黑树的插入 3.1 调整情况一 3.2 调整情况二 3.2.1 调整情况二中的单旋变色 3.2.2 调整情况二中的双旋变色 3.3 调整情况三 3.4 红黑树插入完整代码 4. 红黑树的验证和完整代码 4.1 验证是不是搜索树&#xf…

Pytorch个人学习记录总结 07

目录 神经网络-非线性激活 神经网络-线形层及其他层介绍 神经网络-非线性激活 官方文档地址&#xff1a;torch.nn — PyTorch 2.0 documentation 常用的&#xff1a;Sigmoid、ReLU、LeakyReLU等。 作用&#xff1a;为模型引入非线性特征&#xff0c;这样才能在训练过程中…

【0基础学习python】顺序结构+条件语句+循环结构(文章后面有人生重开模拟器的相关逻辑和简单实现)

1.顺序语句 默认情况下&#xff0c;python的代码执行顺序是按照从上到下的顺序&#xff0c;依次执行的。 print(1) print(2) print(3)执行的结果一定为 1 2 3 &#xff0c;而不会出现 3 2 1 或者 1 3 2等&#xff0c;这种按照顺序执行的代码&#xff0c;我们称为顺序语句。 …

C++第六讲

思维导图 顺序栈定义成模板类 /* ---------------------------------author&#xff1a;YoungZorncreated on 2023/7/22 16:23.--------------------------------- */ #include<iostream>using namespace std;template<typename T> class my_stack { private:T *p…

Unity进阶--声音管理器学习笔记

文章目录 声音管理器 using System.Collections; using System.Collections.Generic; using UnityEngine;public class AudioManager : MyrSingletonBase<AudioManager> {//环境音private AudioSource enPlayer;//音效private AudioSource sePlayer;//音乐private Audio…

IDEA使用AWS CodeWhisperer

IDEA使用AWS CodeWhisperer 首先在IDEA的插件市场中下载AWS Toolkit&#xff1a; 这里我使用的IDEA是2023.1&#xff0c;就是在ToolWindows里把AWS Toolkit面板调出来&#xff1a; 连接&#xff1a; 打开的网页中粘贴上面提过的代码。进入注册流程。 注册完成后返回IDEA&am…

自动驾驶感知系统-毫米波雷达

毫米波雷达就是电磁波&#xff0c;雷达通过发射无线电信号并接收反射信号来测定车辆与物体间的距离&#xff0c;其频率通常介于10~300GHz之间。与厘米波导引头相比&#xff0c;毫米波导引头体积小&#xff0c;质量轻&#xff0c;空间分辨率高&#xff1b;与红外、激光、电视等光…

Vue--插槽

一、插槽-默认插槽 1.作用 让组件内部的一些 结构 支持 自定义 2.需求 将需要多次显示的对话框,封装成一个组件 3.问题 组件的内容部分&#xff0c;不希望写死&#xff0c;希望能使用的时候自定义。怎么办 4.插槽的基本语法 组件内需要定制的结构部分&#xff0c;改用**…

STM32 HAL库定时器输入捕获+更新中断

STM32 HAL库定时器输入捕获更新中断 &#x1f4cd;相关参考&#xff1a;https://www.cnblogs.com/kevin-nancy/p/12569377.html#4621839&#x1f4cc;相关篇《STM32 HAL库定时器输入捕获SlaveMode脉宽测量》 ✨高级定时器的输入捕获功能在脉宽信号测量方面是非常方便的。尤其时…

代码随想录算法训练营第二十一天 | 读PDF复习环节1

读PDF复习环节1 本博客的内容只是做一个大概的记录&#xff0c;整个PDF看下来&#xff0c;内容上是不如代码随想录网站上的文章全面的&#xff0c;并且PDF中有些地方的描述&#xff0c;是很让我疑惑的&#xff0c;在困扰我很久后&#xff0c;无意间发现&#xff0c;其网站上的讲…

JavaEE——Spring中存取Bean的注解

目录 一、存储Bean对象 1、定义 2、存储方式 &#xff08;1&#xff09;、类注解 【1】、Controller&#xff08;控制器存储&#xff09; 【2】、Service&#xff08;服务存储&#xff09; 【3】、Repository&#xff08;仓库存储&#xff09; 【4】、Component&#xf…

创造型模式-原型模式(场景体验-》方案解决===代码图解)

创造型模式-原型模式 创建重复对象-场景体验解决方案&#xff08;原型模式&#xff09;原型模式定义 创建重复对象-场景体验 今天来一个大客户&#xff0c;他要求帮他下100个订单。每个订单除了用户ID&#xff0c;和用户名不同之外&#xff0c;其他个人信息完全相同。 订单类 …