leetcode一道比较难的链表题

news2024/12/29 8:43:33

在这里插入图片描述
今天还是继续来分享我们的链表题,这个题目有点难,主要是思路比较难想,但是如果沥青思路写起来就比较简单了(我乱讲的)

随机链表的复制

在这里插入图片描述

这个是题目的描述,大家也可以在链接里看,那我把这道题目分成三个解题步骤,第一个步骤是我们拷贝一个一摸一样的结点在没个节点后面,但是一模一样的节点我们要把它的值拷贝过来很简单,但是如是是它的random呢,我们只知道图中的节点指向哪里,但是我们不知道它的random到底该怎么解决,那我们得先malloc一个节点,然后插入到上面节点的每一个后面,并把他们继续链接起来,然后进行值拷贝,就是拷贝val这个值,步骤一我们只要完成val的赋值在加上在没一个节点的后面进行链接就行了,我们这里的思路是写一个循环用cur表示当前的位置,copy就是我们需要在cur节点后面进行链接的节点,下面给大家一个图,让大家更好的理解我们的意思和代码。

在这里插入图片描述
那我们就需要在每个节点后面链接,我们这里相当于单链表的随即插入要进行的步骤,首先我们得要一个next的指针来保存后面的节点,这样才能进行链接要不然cur进行下一个步骤的时候就会存在链接不上。步骤一的代码

struct Node* cur = head;
   
    while(cur)
    {
        struct Node* next = cur->next;
        struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
        copy->val = cur->val;
        cur->next = copy;
        copy->next = next;
        cur = next;
    }

这样就能保证我们上面的这个图也是可以成立的,其实这道题的暴力求解也可以解决,但是会存在问题,时间复杂度是O(N的平方),我们的步骤二就是该解决我们random,大家有没有想过我们步骤一的作用就那么简单,其实不是的,因为我们的下一步就是需要怎么样把random放到我们malloc的节点,我们的的cur节点的random是不是可以准确找到,那我们copy的random是不是就是该cur节点的random的next这个节点就是我们当前copy这个节点,步骤一不仅仅把val进行值拷贝,还起到我们链接的作用,代码就是

 cur = head;
    struct Node* copy = cur->next;
    while(cur)
    {
        if(cur->random == NULL)
        {
            copy->random = NULL;

        }
        else
        {
            copy->random = cur->random->next;
        }
        cur = cur->next->next;
        if(cur)
            copy = cur->next;
    }

下一步取出这些节点,在进行链接就行,我们可以用单链表的尾插思路进行实现,我因为之前文章写过尾插的思路,这里就直接给出代码。


    cur = head;
    
    struct Node* newhead = NULL;
    struct Node* tail = NULL;
    while(cur)
    {
        struct Node* copy = cur->next;
         struct Node* next = copy->next;
        if(newhead == NULL)
        {
            newhead = copy;
            tail = copy;
        }
        else
        {
            tail->next = copy;
            tail = tail->next;
        }
        cur->next = next;
        cur = next;

    }
    tail->next = NULL;

那我们运行编译之后还有就是如果我们的链表是空的情况就直接返回空指针就可以了,下面就是我们这道题的完整代码。

struct Node* copyRandomList(struct Node* head) {
	struct Node* cur = head;
    if(head == NULL)
        return NULL;
    while(cur)
    {
        struct Node* next = cur->next;
        struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
        copy->val = cur->val;
        cur->next = copy;
        copy->next = next;
        cur = next;
    }
    cur = head;
    struct Node* copy = cur->next;
    while(cur)
    {
        if(cur->random == NULL)
        {
            copy->random = NULL;

        }
        else
        {
            copy->random = cur->random->next;
        }
        cur = cur->next->next;
        if(cur)
            copy = cur->next;
    }

    cur = head;
    
    struct Node* newhead = NULL;
    struct Node* tail = NULL;
    while(cur)
    {
        struct Node* copy = cur->next;
         struct Node* next = copy->next;
        if(newhead == NULL)
        {
            newhead = copy;
            tail = copy;
        }
        else
        {
            tail->next = copy;
            tail = tail->next;
        }
        cur->next = next;
        cur = next;

    }
    tail->next = NULL;
   
    return newhead;
       

}

那今天的分享就到这里,我们下次再见。
在这里插入图片描述

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

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

相关文章

React中组件之间如何通信?

一、是什么 我们将组件间通信可以拆分为两个词: 组件通信 回顾Vue系列的文章,组件是vue中最强大的功能之一,同样组件化是React的核心思想 相比vue,React的组件更加灵活和多样,按照不同的方式可以分成很多类型的组件…

Unity游戏开发基础之数据结构部分

设计模式 含义:帮助我们降低对象之间的耦合度常用的方法称为设计模式。使用设计模式是为了可重用代码,让代码更容易被其他人所理解,保证代码可靠性,使代码编制真正工程化,这是软件工程的基石。 分类: 创建…

Figma转Sketch文件教程,超简单!

相信大家做设计的都多多少少听过一点Figma和Sktech,这2个设计软件是目前市场上很受欢迎的专业UI设计软件,在全球各地都有很多粉丝用户。但是相对来说,Figma与Sketch只支持iOS系统有所不同,Figma是一个在线设计软件,不限…

Flink(二)【Flink 部署模式】

前言 今天是Flink学习的第二天,我的心情异常的复杂哈哈哈(苦笑),学习上还是比较顺利的,感情上我并不擅长,所以心情波动大在所难免。害,至少还有学习让我不被各种糟糕琐碎的日常生活里的人和事所…

【2023方案开发】无刷电机自动打气泵方案

如今新能源车大行其道,而车厂在考虑成本和设计的情况下,将备胎给取消了,那假如在车胎气压不足的状态下,没有备胎更换,那将如何解决困境。气压不住需要打气,那配备一台打气泵尤为重要,即使常年可…

Git系列之Git入门级(带你走进Git的世界)

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Git实战开发》。🎯🎯 &a…

论文速览 MobiCom 2023 | NeRF2 : Neural Radio-Frequency Radiance Fields

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 Xiaopeng Zhao, Zhenlin An, Qingrui Pan, and Lei Yang. 2023. NeRF2: Neural Radio-Frequency Radiance Fields. In Proceedings of the 29th Annual International Conference on Mobil…

AIGC:使用生成对抗网络GAN实现MINST手写数字图像生成

1 生成对抗网络 生成对抗网络(Generative Adversarial Networks, GAN)是一种非常经典的生成式模型,它受到双人零和博弈的启发,让两个神经网络在相互博弈中进行学习,开创了生成式模型的新范式。从 2017 年以后&#x…

kubectl声明式资源管理命令

一、声明式资源管理介绍: 适合于对资源的修改操作声明式资源管理方法依赖于资源配置清单文件对资源进行管理资源配置清单文件有两种格式:yaml(人性化,易读),json(易于api接口解析)对…

如何排查CPU飙升的问题所在

我们在线上排查问题的时候发现系统的CPU直接爆红了,如何排查问题呢?怎么快速定位问题的所在呢? linux系统下: 首先我们通过top命令来查看那个进程占用CPU过大: top 这里只是简单的模拟一下,假设java进程占用CPU很大,那么我们通过这个进程来查找进程下的线程使用CPU的情况…

【23真题】C9无歧视,专业课均分130!

今天分享的是23年哈尔滨工业大学803的信号与系统部分的试题及解析。 本套试卷难度分析:22年哈今天分享的是23年哈尔滨工业大学803的信号与系统部分的试题及解析。 哈尔滨工业大学803考研真题,我也发布过,若有需要,戳这里自取&…

6-爬虫-scrapy解析数据(使用css选择器解析数据、xpath 解析数据)、 配置文件

1 scrapy解析数据 1.1 使用css选择器解析数据 1.2 xpath 解析数据 2 配置文件 3 整站爬取博客–》爬取详情–》数据传递 scrapy 爬虫框架补充 # 1 打码平台---》破解验证码-数字字母:ddddocr-计算题,滑块,成语。。。-云打码,超…

文件上传 [GXYCTF2019]BabyUpload1

打开题目 传个是jpg文件后缀的一句话木马上去 代码如下 <script languagephp>eval($_POST[v]);</script> 发现上传成功 因此我们需要先上传 .htaccess 文件&#xff0c;然后再上传 2.jpg文件 .htaccess作用&#xff1a;文件将别的后缀名文件内容解析为php程序…

使用matlab实现图像信号的色彩空间转换

利用matlab对图像信号进行读取&#xff0c;并对RGB空间进行转换&#xff0c;如转换到HSI空间等。 下面的这个代码是在使用了rgb2hsi()方法失败后&#xff0c;进行修改的。 rgb2hsi(img)这个方法可以将RGB图像转换为HIS图像&#xff1b;但是爆出了 Untitled5(line 5)hsi rgb2h…

通过Cookie和Session来实现网站中登录账号的功能

文章目录 一、Cookie和Session二、基于Cookie和Session实现登录账号的功能2.1步骤一2.2步骤二2.3步骤三2.4总结通过Cookie和Session来实现登录功能2.5运行截图 一、Cookie和Session cookie是http请求header中的一个属性&#xff0c;是浏览器持久化存储数据的一种机制&#xff…

2023年香港专才计划(输入内地人才计划)拿身份最新申请攻略!

2023年香港专才计划&#xff08;输入内地人才计划&#xff09;拿身份最新申请攻略&#xff01; 近年来&#xff0c;香港受持续的人口老龄化等多因素影响&#xff0c;2022年香港人口总计减少了约12.17万人&#xff0c;跌幅1.6%&#xff0c;其中净移出人数约9.5万人。在此背景下&…

web3 从redux中拿出所有已完成订单 并渲染到对应的Table列表中

上文web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中 中 我们已经从 区块中拿到了自己的订单 然后 我们恢复一下上文的环境 ganache ganache -d然后 登一下 MetaMask 然后 用我们的项目 发布一下合约 truffle migrate --reset然后…

汽车标定技术(八)--MPC57xx是如何支持标定的页切换

目录 1.页切换的概念 1.1 标定常量的理解 1.2 页切换 2.MPC57xx的Overlay模块 3.小结 1.页切换的概念 在汽车标定测量中&#xff0c;有一个概念我想很多人都听过&#xff0c;但是实际上在项目里没有用到过&#xff0c;那就是今天要讲的页切换概念。在讲页切换的时候&#…

自考改革过渡期!广东小自考最优解只需要2门笔试

图片来源&#xff1a;广东省考试院* 近期广东教育考试院公布了自考专业调整的相关通知&#xff0c;新的专业考试计划从2026年1月起执行。 这次改革过渡期中有一个重大利好消息&#xff0c;小自考专业笔试统考科目最少只需考2门笔试&#xff01; 这是为什么呢&#xff1f; 小…

蓝牙安全管理(SM:Security Manager)规范详解

总述 配对(Pairing)分为三个阶段&#xff0c;前两个阶段是必须的&#xff0c;而第三阶段是可选的&#xff0c;三个阶段如下&#xff1a; 阶段1&#xff1a;配对功能交换(Pairing Feature Exchange) 阶段2(LE传统配对 LE legacy pairing)&#xff1a;短期密钥(STK:Short Term…