leetcode一道比较难的链表题

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

随机链表的复制

在这里插入图片描述

这个是题目的描述,大家也可以在链接里看,那我把这道题目分成三个解题步骤,第一个步骤是我们拷贝一个一摸一样的结点在没个节点后面,但是一模一样的节点我们要把它的值拷贝过来很简单,但是如是是它的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.mfbz.cn/a/122799.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深眸科技聚焦3D机器视觉技术,从技术形态到应用前景实现详细分析

机器视觉技术的不断升级,使得对二维图像的处理逐渐扩展到了更复杂的三维领域,形成了3D机器视觉。3D机器视觉是机器视觉的重要应用领域之一,通过计算机能够在短时间内处理视觉传感器采集的图像信号,从而获得目标对象的三维信息。 …

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

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

OCR文字识别生成双层PDF,一键解锁文件编辑新技能

在当今信息时代,OCR(Optical Character Recognition)技术已经成为数字化转型中不可或缺的一环。利用OCR技术,我们可以将纸质文档转化为可编辑的电子文档,便于存储、检索和共享。然而,有时候我们需要将识别后…

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

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

黑洞路由的几种应用场景

第一种在内网中产生环路: 这种核心交换机上肯定写一条默认路由 0.0.0.0 0 10.0.0.1 出口路由要写一条192.168.0.0 16 10.0.0.2 如果出口路由访问一条不存在的内网网段,又或者访问的那台终端停机了,那就会产生三层环路,数据包在…

git命令行操作

git remote update origin --prune 更新本地的git分支保持和远程分支一致 git clone -b develop XXX 拉取某个分支的代码 1、创建一个空文件夹,在其中打开Git Bash Here,输入: git clone 刚刚复制的粘贴过来,回车 2、打开你拉下…

【扩散模型】5、Diffusion models beat GAN | 使用类别引导图像生成

论文:Diffusion models beat GAN on image Synthesis 代码:https://github.com/openai/guided-diffusion 出处:OPENAI | NIPS2021 时间:2021 贡献: 在本文章之前,扩散模型生成的图片已经非常逼真了&am…

SpringBoot 配置进阶

一、ConfigurationProperties 1、 在类定义上 ConfigurationProperties注解,此注解是用来为bean绑定属性。使用步骤如下: 在配置文件 application.yml 中,添加配置信息 servers:ip-address: 127.0.0.1port: 8123创建配置类,并在…

conda环境中pytorch1.2.0版本安装包安装一直失败解决办法!!!

conda环境中pytorch1.2.0版本安装包安装一直失败解决办法 cuda10.0以及cudnn7.4现在以及安装完成,就差torch的安装了,现在torch我要装的是1.2.0版本的,安装包以及下载好了,安装包都是在这个网站里下载的(点此进入&…

python使用selenium做自动化,最新版Chrome与chromedriver不兼容

目前Chrome版本是118.0.5993.118 下方是版本对应的下载地址: chrome版本118: https://download.csdn.net/download/qq_35845339/88510476 chrome版本119: chromedriverlinux64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testin…

【Linux C IO多路复用】多用户聊天系统

目录 Server-Client mutiplexingServer mutiplexingClient mutiplexing Server-Client 在Linux系统中,IO多路复用是一种机制,它允许一个进程能够监视多个文件描述符(sockets、pipes等)的可读、可写和异常等事件。这样&#xf…

洋子带你赚钱,粉丝有奖任务来啦,最高拿90京东卡

大家好,我是洋子,前段时间CSDN联合阿里云发布了免费试用3种 云服务器的活动任务,每完成一个任务就可以拿到30京东卡,3个任务互相独立,如果3个任务全部完成就可以拿到90京东卡 任务奖励 参与体验大概十几分钟&#xf…

类直径树上贪心

http://cplusoj.com/d/senior/p/SS231109C 场上想到枚举点&#xff0c;然后最大值为高&#xff0c;然后可以求最大值。但是感觉计数会重 计数其实不会重&#xff0c;如图中&#xff0c;红色线段显然比蓝色线段优 所以我们枚举3叉点时没错的 #include<bits/stdc.h> usin…

『亚马逊云科技产品测评』活动征文|AWS 云服务器实例类型及其适用场景详细说明

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 目录 一、AWS 定价计算器 &#xff08;1&#xff09;定价计算器官网 &…

深度学习_10_softmax_实战

由于网上代码的画图功能是基于jupyter记事本&#xff0c;而我用的是pycham,这导致画图代码不兼容pycharm,所以删去部分代码&#xff0c;以便能更好的在pycharm上运行 完整代码&#xff1a; import torch from d2l import torch as d2l"创建训练集&创建检测集合"…

使用合成数据训练语义分割模型

计算机视觉应用现在在各个科技领域无处不在。 这些模型高效且有效&#xff0c;研究人员每年都会尝试新想法。 新的前沿是试图消除深度学习的最大负担&#xff1a;需要大量的标记数据。 正如本文所述&#xff0c;此问题的解决方案是使用合成数据。 从这些研究中获益最多的计算机…

ros1 模拟客户端生成小乌龟服务请求生成小乌龟

模拟客户端生成小乌龟服务请求生成小乌龟 一、话题模型二、创建功能包三 创建客户端Client代码四 配置CMakeLists.txt编译规则&#xff1a;五 测试启动ros 主服务启动小乌龟的服务启动模型客户端服务 一、话题模型 Sever端是海龟仿真器/turtlesim&#xff0c;Client端是待实现…

Android 13.0 Launcher3 app图标长按去掉应用信息按钮

1.前言 在13.0的rom定制化开发中,在Launcher3定制化开发中,对Launcher3的定制化功能中,在Launcher3的app列表页会在长按时,弹出微件和应用信息两个按钮,点击对应的按钮跳转到相关的功能页面, 现在由于产品需求要求禁用应用信息,不让进入到应用信息页面所以要去掉应用信息…

BigDecimal使用的时候需要注意什么?

BigDecimal只要涉及到浮点数运算都会用到BigDecimal&#xff0c;并且面试的时候经常会问到&#xff0c;那么BigDecimal使用的时候需要注意什么&#xff1f; 目录 1.为什么不能用浮点数表示金额&#xff1f;2.十进制转换二进制3.科学记数法4.IEEE 7545.在线浮点数转换二进制6.原…

限流式保护器在养老院火灾预防中的应用

安科瑞 华楠 【摘要】老年人是一个庞大特殊的社会群体。随着我国人口的老龄化&#xff0c;老年人口数量断上升。涉及老年人的火灾越来越多&#xff0c;本文从养老院火灾的案例、成因、预防措施等方面对此类火灾进行了深入的探讨。 【关键词】老年公寓&#xff1b;火灾预防&…
最新文章