【力扣】剑指offer第二天

news2024/9/22 2:11:05

剑指offer第二天

    • [剑指 Offer 06. 从尾到头打印链表 - 力扣(LeetCode)]
      • 方法一
      • 代码
      • 方法二
      • 代码
    • [剑指 Offer 24. 反转链表 - 力扣(LeetCode)]
      • 方法一
      • 代码
      • 方法二
      • 代码
    • [剑指 Offer 35. 复杂链表的复制 - 力扣(LeetCode)]
      • 方法一
      • 代码
      • 方法二
      • 代码

[剑指 Offer 06. 从尾到头打印链表 - 力扣(LeetCode)]

link

image-20221204224450442

方法一

递归法

image-20221206210957442

把整个链表从尾到头写入到一个数组里,比如,倒序1为头节点的链表,就要先把2为头节点的链表先倒序放到数组中,再把1节点push_back到数组中。2为头节点的链表倒序,就是先把3为头节点的链表倒序放到数组中,再把2节点push_back到数组中,依此类推

代码

int reverse_(ListNode* head,vector<int>&tmp)
{
    if(head->next==NULL)
    {
        return head->val;
    }
    tmp.push_back(reverse_(head->next,tmp));
    return head->val;
}

class Solution {
public:
    vector<int> reversePrint(ListNode* head) 
    {
        vector<int> tmp;
        if(head==NULL)
        return tmp;
        tmp.push_back(reverse_(head,tmp));
        return tmp;
    }
};

方法二

遍历链表,将节点的值放进数组中,再使用算法库提供的reverse()函数

代码

class Solution {
public:
    vector<int> reversePrint(ListNode* head) 
    {
        vector<int> tmp;
        ListNode* cur=head;
        while(cur)
        {
            tmp.push_back(cur->val);
            cur=cur->next;
        }
        reverse(tmp.begin(),tmp.end());
        return tmp;
    }
};

[剑指 Offer 24. 反转链表 - 力扣(LeetCode)]

link

image-20221206212603381

方法一

递归法

image-20221206210957442

总体思路与上一道题的递归法思路一致

代码

class Solution {
public:
    ListNode* reverseList(ListNode* head) 
    {
           if(head==NULL||head->next==NULL)
           {
               return head;
           }
           ListNode* newnode=reverseList(head->next);
           head->next->next=head;
           head->next=NULL;
           return newnode;
    }
};

方法二

进入循环前

image-20221206220620581

第一次循环结束

image-20221206220659183

第二次循环结束

image-20221206220801399

第三次循环结束

image-20221206220840033

第四次循环结束

image-20221206220945153

第五次循环结束

image-20221206221017590

代码

class Solution {
public:
    ListNode* reverseList(ListNode* head) 
    {
        ListNode* prev=NULL;
        ListNode* cur=head;
        while(cur)
        {
           ListNode* next=cur->next;
            cur->next=prev;
            prev=cur;
            cur=next;
        }
        return prev;
    }
};

[剑指 Offer 35. 复杂链表的复制 - 力扣(LeetCode)]

link

方法一

两遍遍历:

第一遍遍历,创建节点,链接next,并且创建链表的每一个节点时,将被拷贝节点的地址和新创建节点的地址建立哈希

第二遍遍历,使用哈希表,通过原链表每一个节点中random的内容,映射到新链表对应的节点地址,写入新链表当前节点的random

代码

class Solution {
public:
    Node* copyRandomList(Node* head) 
    {
        if(head==nullptr)
        {
            return nullptr;
        }

        unordered_map<Node*,Node*> _map;
        Node* _head=new Node(head->val);
        Node* prev=_head;
        Node* cur=head->next;
        _map[head]=_head;
        while(cur)
        {
            prev->next=new Node(cur->val);
            prev=prev->next;
            _map[cur]=prev;
            cur=cur->next;
        }
        cur=head;
        Node* _cur=_head;
        while(cur)
        {
            _cur->random=_map[cur->random];
            cur=cur->next;
            _cur=_cur->next;
        }
        return _head;
    }
};

方法二

image-20221204220806711

三遍遍历:

第一遍遍历

先将每一个节点,拷贝一份,接到被拷贝节点的后面,

第二遍遍历

拷贝节点的random指向的节点就是被拷贝节点的random指向的节点的下一个节点

第三遍遍历

拷贝节点拿出来形成一个新从链表

代码

class Solution {
public:
    Node* copyRandomList(Node* head) 
    {
        if(head==nullptr)
        {
            return nullptr;
        }
        unordered_map<Node*,Node*> _map;
        Node* _head=new Node(head->val);
        Node* prev=_head;
        Node* cur=head->next;
        _map[head]=_head;
        while(cur)
        {
            prev->next=new Node(cur->val);
            prev=prev->next;
            _map[cur]=prev;
            cur=cur->next;
        }
        cur=head;
        Node* _cur=_head;
        while(cur)
        {
            _cur->random=_map[cur->random];
            cur=cur->next;
            _cur=_cur->next;
        }
        return _head;
    }
};

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

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

相关文章

日期功能组件(加上左右点击,更改月份)

要求效果&#xff1a; &#xff0c;直接可以显示年月&#xff0c;并且点击左右箭头可以更改月份 点击这个日期&#xff0c;可以选择。 最后实现效果&#xff1a; 实现&#xff1a; 先找一个插件&#xff0c;可以选择时间 <!-- 选择年月--><div class"form-…

SAP ARFCSTATE ARFCSDATA TRFCQOUT

SELECT count(1) FROM arfcsstate --18848155 20221122 清理前 -- 6582457 清理后 SELECT count(1) FROM ARFCSDATA a -- 81732430 202221122 清理前 -- 25064628 清理后 SELECT count(1) FROM TRFCQOUT t --18848095 202221122 …

面试必备:HashMap底层源码原来是这么简单(分析)

微信公众号&#xff1a;SteveCode 关注可了解更多的编程及开发经验。问题或建议&#xff0c;请公众号留言; 专注Java技术干货分享&#xff0c;Java技术、数据结构、相关工具、Spring全家桶、intellij idea…… 如果你觉得对你有帮助&#xff0c;欢迎赞赏 transient 发现了这个关…

re:Invent现场访谈:云计算如何重塑智能制造

众所周知&#xff0c;近年来包括中国和美国在内&#xff0c;世界上各个主要国家对制造业的关注度都在不断提升。也正因为如此&#xff0c;在2022亚马逊云科技re:Invent全球大会上&#xff0c;有关云计算技术在智能制造行业的应用&#xff0c;也理所当然地成为了诸多与会嘉宾关注…

【JMeter】线程组jp@gc - Stepping Thread Group(逐步线程组)

jpgc - Stepping Thread Group 逐步线程组 Action to be taken after a Sample error 发生sample错误时 Continue 继续 Start Next Thread Loop 开始新的线程 Stop Thread 停止线程 Stop Test 停止测试 Stop Test Now 立即停止测试 Threads Scheduling Parameters 线程调度…

STM32+雷龙SD NAND(贴片SD卡)完成FATFS文件系统移植与测试

一、前言 在STM32项目开发中&#xff0c;经常会用到存储芯片存储数据。 比如&#xff1a;关机时保存机器运行过程中的状态数据&#xff0c;上电再从存储芯片里读取数据恢复&#xff1b;在存储芯片里也会存放很多资源文件。比如&#xff0c;开机音乐&#xff0c;界面上的菜单图…

使用SpringBoot快速构建Web API

Dubbo 框架现在在国内的中小企业当中已经成为 Java 生态下服务化的事实标准&#xff0c;出现这种状态的原因很多&#xff0c;比如 Dubbo 框架设计优秀、文档和资料丰富、配置灵活、特性丰富等&#xff0c;但最主要的&#xff0c;我认为是 Java 开发人员对速度这一因素的痴迷。 …

详解设计模式:解释器模式

解释器模式&#xff08;interpreter pattern&#xff09;&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。 解释器模式 这种模式被用在 SQL 解析、符号处理引擎等。 解释器模式 给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xf…

HTTP状态码是什么?

文章目录HTTP状态码1. 消息&#xff1a;1xx2. 成功&#xff1a;2xx3. 重定向&#xff1a;3xx4. 请求错误&#xff1a;4xx5. 服务器错误&#xff1a;5xxHTTP状态码 HTTP 状态码&#xff08;HTTP Status Code&#xff09;是一个表示服务器响应状态的 3 位整数代码。比如当服务器…

[Database] 关系型数据库中的MVCC是什么?怎么理解?原理是什么?MySQL是如何实现的?

文章目录前言并发控制并发控制的实现与锁的本质MVCC是什么&#xff1f;MVCC的多版本&#xff08;Multi-Version&#xff09;指的是什么&#xff1f;MVCC的实现方式&#xff1f;MySQL的实现PostgreSQL的实现结语前言 在并发场景下&#xff0c;如果我们不对数据做保护&#xff0c…

分布式文件存储系统FastDFS[1]-介绍以及安装

一、分布式文件存储 1.分布式文件存储的由来 在我们的项目中有很多需要存储的内容出现&#xff0c;比如图片&#xff0c;视频&#xff0c;文件等等&#xff0c;在早期的时候用户量不大&#xff0c;产生的文件也不是很多&#xff0c;这时我们可以把文件和服务程序放在一个服务器…

STAAD.Pro CONNECT Edition

STAAD.Pro CONNECT Edition Bentley STAAD或STAAD Pro软件是分析和设计世界第三世界的第一款最佳工程软件&#xff0c;对于金属、混凝土、木材、铝和冷金属的专业选择&#xff0c;设计几乎所有类型的塑料、石化、隧道、桥梁、蜡烛等结构专业的功能和软件中任何数据大小的使用。…

Java课程案例学习(3)

2.1 学生管理系统实现步骤 案例需求 针对目前我们的所学内容&#xff0c;完成一个综合案例&#xff1a;学生管理系统&#xff01;该系统主要功能如下&#xff1a; 添加学生&#xff1a;通过键盘录入学生信息&#xff0c;添加到集合中 删除学生&#xff1a;通过键盘录入要删…

Jcmd 虚拟机诊断利器

Jcmd 虚拟机诊断利器 Java虚拟机&#xff08;JVM&#xff09;是运行Java程序的抽象化的计算器。今天&#xff0c;来学习下如何轻松诊断正在运行的JVM。 JDK本身中提供了许多可用的工具&#xff0c;可以用于各种开发、监视和故障排除活动。推荐使用jcmd&#xff0c;简单易懂&a…

[附源码]计算机毕业设计南通大学福利发放管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

ThinkPHP6综合业务管理系统

有需要请私信或看评论链接哦 可远程调试 ThinkPHP6综合业务管理系统一 介绍 综合业务管理系统基于ThinkPHP6开发&#xff0c;数据库mysql&#xff0c;前端Layui&#xff0c;后台模板ok-admin。管理员登录系统后可对场所&#xff0c;分类&#xff0c;用户&#xff0c;运营商&am…

图片扫描仪第一弹,我实现了一个办公位简笔画

来一波对比 其实我工位还有点手办&#xff0c;一个植物&#xff0c;实在不会画&#xff0c;于是画了个基础版的。 办公位简笔画 虽然&#xff0c;这个工位上没有一个动画&#xff0c;但是图形和实物神似&#xff0c;所以可以用另一个动总结这个简笔画&#xff0c;那就是生动…

量子计算(十一):常见逻辑门以及含义

文章目录 常见逻辑门以及含义 一、Hadamard&#xff08;H&#xff09;门 二、Pauli-X 门 三、Pauli-Y 门 四、Pauli-Z 门 五、旋转门&#xff08;rotation operators&#xff09; 1、RX&#xff08;θ&#xff09;门 2、RY&#xff08;θ&#xff09;门 3、RZ&#xf…

深入理解计算机系统

hi&#xff0c;大家好&#xff0c;我是大师兄&#xff0c;让我们一起复习了一遍计算机系统核心知识&#xff0c;希望大家早日掌握这些核心知识&#xff0c;打造自己坚实的基础&#xff0c;为自己目标慢慢积累&#xff0c;等到自己春天的到来。详细点击查看-> 极客星球。计算…

PDF解除密码怎么操作?教你一键解除密码

我们在处理工作文件时&#xff0c;经常会有一些文件是加密状态的&#xff0c;这种文件必须要输入密码才可以打开&#xff0c;这时候就造成了很多不便&#xff0c;如果文件需要打印&#xff0c;我们就必须先输入密码&#xff0c;而且在每次查看文件前&#xff0c;都必须输入密码…