【LeetCode】剑指 Offer(18)

news2025/7/14 15:49:48

目录

题目:剑指 Offer 35. 复杂链表的复制 - 力扣(Leetcode)

题目的接口:

解题思路:

代码:

过啦!!!

写在最后:


题目:剑指 Offer 35. 复杂链表的复制 - 力扣(Leetcode)

题目的接口:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/
class Solution {
public:
    Node* copyRandomList(Node* head) {

    }
};

解题思路:

一开始先判断一下链表是否为空,

如果为空,直接返回空就行。

接下来是思路:

我的思路是通过原链表再复制一个链表:

 所以我们的第一步就是循环创建一个链表,

接在原链表上,如上图,

然后,

第二步是将原链表的random指针同样复制到新的链表上,

(改random的图我懒得画了,如果感兴趣可以自己画一画)

最后一步就是将新的链表独立出来,

再让原链表恢复,如下图:

 最后再返回新的链表的头结点即可。

代码如下:

代码:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/
class Solution {
public:
    Node* copyRandomList(Node* head) {
        //判断链表是否为空
        if(!head)
        {
            return nullptr;
        }

        //复制原链表
        Node* cur = head;
        while(cur)
        {
            //new一个新节点,并初始化val
            Node* copy = new Node(cur->val);
            copy->next = cur->next;
            cur->next = copy;
            cur = copy->next;
        }

        //复制原链表的指针
        cur = head;
        while(cur)
        {
            //如果randam是指向空指针就不用管(因为原本就是空)
            if(cur->random)
            {
                cur->next->random = cur->random->next;
            }
            cur = cur->next->next;
        }

        //将原链表还原,将新链表独立出来
        Node* newhead = head->next;
        Node* prev = head;
        cur = newhead;
        while(cur->next)
        {
            //还原原链表
            prev->next = prev->next->next;
            prev = prev->next;

            //独立新链表
            cur->next = cur->next->next;
            cur = cur->next;
        }

        //新链表的尾
        prev->next = nullptr;

        //返回新链表的头
        return newhead;
    }
};

过啦!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。

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

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

相关文章

Mysql8.0的特性

Mysql8.0的特性 建议使用8.0.17及之后的版本,更新的内容比较多。 新增降序索引 -- 如下所示,我们可以在创建索引时 在字段名后面指定desc进行降序排序 create table t1(c1 int,c2 int,index idx_c1_c2(c1,c2 desc));group by 不再隐式排序 mysql5.7的版…

使用Chakra-UI封装简书的登录页面组件(React)

要求:使用chakra ui和react 框架将简书的登录页面的表单封装成独立的可重用的组件使用到的API:注册API请求方式:POST 请求地址:https://conduit.productionready.io/api/users请求数据: {"user":{ "username&quo…

typora-beta-0.11.18版本又提示过期的解决方案

很实用,所以照搬一下下面的作者的回答,省得以后再找~~~ 知乎的作者来源如下: 作者:吴小皓 链接:typora打开报错:This beta version of Typora is expired, please download and install a newer version …

Servlet | Servlet简单入门——构建第一个Servlet项目

本专栏主要是记录学习JavaWeb中的Servlet相关知识点,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址:🔥Servlet Java入门篇: 🔥Java基础学习篇 Java进阶学习篇(持续更新中)&am…

AAAI2023 | VBLC:恶劣条件下针对领域自适应语义分割的可见度增强和逻辑值约束...

点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入!李明嘉:北京理工大学硕士研究生,目前研究方向为迁移学习、语义分割。内容简介:在实际系统中,要求将在正常视觉条件下训练的模型推广到不利条件下的目标域。一种普遍的…

Cacti监控讲解

Cacti监控讲解 1、Cacti原理的概述 组件构成: 组合框架:LAP数据收集:SNMP 这个是简单的网络管理协议监控的必须使用的协议;SNMP Apache:web页面提供; 动态共享模块功能; 绘制图形&#xff1a…

Python图像处理:频域滤波降噪和图像增强

图像处理已经成为我们日常生活中不可或缺的一部分,涉及到社交媒体和医学成像等各个领域。通过数码相机或卫星照片和医学扫描等其他来源获得的图像可能需要预处理以消除或增强噪声。频域滤波是一种可行的解决方案,它可以在增强图像锐化的同时消除噪声。 …

Linux:利用返回值传出参数,地址传递,值传递,使用回调函数赋值几个例程。

利用返回值传出参数&#xff0c;地址传递&#xff0c;值传递,使用回调函数赋值几个例程。 代码&#xff1a; #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <string…

C++ 算法主题系列之集结0-1背包问题的所有求解方案

1. 前言 背包问题是类型问题&#xff0c;通过对这一类型问题的理解和掌握&#xff0c;从而可以归纳出求解此类问题的思路和模板。 背包问题的分类有&#xff1a; 0-1背包问题&#xff0c;也称为不可分割背包问题。无限背包问题。判定性背包问题.带附属关系的背包问题。双背包…

如何提高软件测试执行力

高效的测试执行力 不管在哪个行业&#xff0c;高校的执行力都是不可或缺的。在软件测试行业更是这样。有些测试人员&#xff0c;很勤奋也很吃苦&#xff0c;但是可能最终不能很好的完成测试任务。究其原因就是一个测试执行力的问题。 高效执行就是有目标&#xff0c;有计划&…

BUUCTF [羊城杯 2020]easyre 题解

一.查壳 64位无壳 二.主函数逻辑 可以得知flag长度为38,然后进行三次加密 第一次加密是base64加密,得到code1 第二次加密是将code1拆成四段赋给code2 第三次加密是将code2内的数字和字母移3位,其他字符不变 str2保存的是最终的加密字符 三.encode_one_base64 看到主函数…

【Linux】Sudo的隐晦bug引发的一次业务问题排查

Sudo的隐晦bug引发的一次业务问题排查写在前面问题描述问题排查高负载现象排查日志排查跟踪任务调度过程Sudo引发的问题手动复现问题分析处理方案写在前面 记录一次生产环境sudo启动进程频繁被Kill且不报错的异常处理过程&#xff0c;如果遇到同样的问题只想要解决方案&#x…

AWS攻略——初识流量镜像

在实际应用场景下&#xff0c;我们可能需要建立一个测试环境&#xff0c;既能接线上流量&#xff0c;又不希望影响线上业务&#xff0c;这个时候流量镜像就派上用场。它会将一个网络接口中的流量复制到另外一个网络接口中&#xff0c;然后在后者上分发&#xff0c;而前者不受影…

AQS 源码解读

一、AQS AQS 是 AbstractQueuedSynchronizer 的简称&#xff0c;又称为同步阻塞队列&#xff0c;是 Java 中的一个抽象类。在其内部维护了一个由双向链表实现的 FIFO 线程等待队列&#xff0c;同时又提供和维护了一个共享资源 state &#xff0c;像我们平常使用的 ReentrantLo…

OpenCV-PyQT项目实战(12)项目案例08:多线程视频播放

欢迎关注『OpenCV-PyQT项目实战 Youcans』系列&#xff0c;持续更新中 OpenCV-PyQT项目实战&#xff08;1&#xff09;安装与环境配置 OpenCV-PyQT项目实战&#xff08;2&#xff09;QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战&#xff08;3&#xff09;信号与槽机制 …

配置Clion用于STM23开发(Makefile)

前言 对于Clion配置STM32开发环境的教程在网上一搜一大堆&#xff0c;但是大部分都是22年之前的&#xff0c;使用的方法都是在STM32CubeMX生成SW4STM32工程。但是在22年不知道哪个版本后&#xff0c;CubeMX已经不再支持生成SW4STM32工程了&#xff0c;这也是我本人遇到的问题。…

10 Wifi网络的封装

概述 Wifi有多种工作模式,比如:STA模式、AccessPoint模式、Monitor模式、Ad-hoc模式、Mesh模式等。但在IPC设备上,主要使用STA和AccessPoint这两种模式。下面分别进行介绍。 STA模式:任何一种无线网卡都可以运行在此模式,这种模式也是无线网卡的默认模式。在此模式下,无线…

【算法】图的存储和遍历

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;或许会很慢&#xff0c;但是不可以停下&#x1f43e; 文章目录1. 图的存储1.1 邻接矩阵1.2 邻接表2. 图的遍历2.1 dfs 遍历2.2 bfs 遍历1. 图的存储 引入 一般来说&#xff0c;树和图有两种存储方式&#…

【Java】Mybatis查询数据库

文章目录MyBatis查询数据库1. MyBatis 是什么&#xff1f;2. 为什么要学习MyBatis&#xff1f;3. 怎么学MyBatis&#xff1f;4. 第一个MyBatis查询4.1 创建数据库和表4.2 添加MyBatis框架支持4.3 配置连接字符串和MyBatis4.3.1 配置连接数据库配置MyBatis中的XML路径4.4 添加业…

宝刀未老?VB语言迎来春天,低代码绝地逢生,程序员能淡定吗?

一、VB语言迎来春天 “VB语言过时了&#xff0c;早就淘汰了”&#xff0c;不少程序员认为&#xff0c;如今VB上不了台面。 有人说&#xff1a;VB是被微软砍掉的优秀产品之一&#xff0c;当年还和Delphi打对台来着, 那时候真的是如日中天&#xff01; 颠覆许多人认知的是28年过…