OJ第三篇

news2024/11/22 21:17:06

文章目录

  • 随机链表的复制

随机链表的复制

链接:随机链表的复制
在这里插入图片描述

这个题简单而言就是它给一个链表,每个结点包含两个指针,分别指向下一个和一个随机的结点(也有可能指向空),你要做的就是复制这个链表,使你创建的链表的结点也分别指向你创建的链表的结点的下一个值和对应的那个随机值。

这道题的难点是原链表中那个随机指针的指向在新链表中并不能用,你得找到新链表中对应的那个位置才可以,当然我们可以暴力求解,就是先复制链表的data和next值,先不管random,创建好了之后就去找原链表中每个结点的random值是NULL还是第几个结点的指针,两个指针指向两个链表中的对应相同的位置去找。

struct Node* copyRandomList(struct Node* head) {
 struct Node*cur=head;
 struct Node*newhead=NULL,*tail=NULL;
 //下边是去创建新链表
 while(cur!=NULL){
     struct Node*tmp=(struct Node*)malloc(sizeof(struct Node));
     tmp->val=cur->val;
     tmp->next=NULL;
     tmp->random=NULL;
     if(newhead==NULL){
     newhead=tail=tmp;
     }
     else{
         tail->next=tmp;
         tail=tail->next;
     }
     cur=cur->next;
 }
//下边管random
cur=head;
struct Node*copycur=newhead;
while(cur!=NULL){
        struct Node*tmp1=head;
        struct Node*tmp2=newhead;
        while(cur->random!=tmp1){//去找对应的位置,如果为空就是最后一个位置,也能找到
            tmp1=tmp1->next;
            tmp2=tmp2->next;
        }
        copycur->random=tmp2;
    cur=cur->next;
    copycur=copycur->next;
}
return newhead;
}

上面是暴力求解的过程,时间复杂度都已经O(N^2),那么如何简化一下算法呢?我们的问题是找不到random的值,那我们就想法让它有迹可循,方法是:我们把复制的结点创建到原链表的每个对应的结点的后面,那就不管next,先管random,random的值就是原结点的random的值的下一个,之后再把新结点摘下来,组成一个新的链表,恢复原链表,可能这么说有点抽象,我们画图来看一下

在这里插入图片描述

struct Node* copyRandomList(struct Node* head) {
    //先在每个结点后面添加一个相同的结点
	struct Node* cur=head;
    while(cur){
        struct Node*newnode=(struct Node*)malloc(sizeof(struct Node));
        newnode->val=cur->val;
        struct Node*next=cur->next;
        cur->next=newnode;
        newnode->next=next;
        cur=next;
    }
    //处理拷贝结点的random
    cur=head;
    while(cur){
        if(cur->random==NULL){
            cur->next->random=NULL;
        }
        else{
cur->next->random=cur->random->next;
        }
        cur=cur->next->next;
    }
//把拷贝的结点摘下来并且恢复原链表
cur=head;
struct Node*newhead=NULL,*tail=NULL;
while(cur){
    struct Node*copy=cur->next;
    struct Node*next=copy->next;
    if(newhead==NULL){
        newhead=tail=copy;
    }
    else{
        tail->next=copy;
        tail=tail->next;
        tail->next=NULL;
    }
    cur->next=next;
    cur=next;
}
return newhead;
}

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

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

相关文章

Leetcode算法解析——快乐数

1.题目链接:快乐数 2.题目描述: 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循…

死锁原因及死锁检测组件的实现

1 死锁形成的条件 死锁,是指多个线程或者进程在运行过程中因争夺有限的系统资源而造成的一种僵局,当进程或者线程处于这种僵持状态,若无外力作用,它们将无法再向前推进。如下图所示,线程 A 想获取线 程 B 的锁&#x…

当你在 Tubi 是一位 Tech Lead

在过去,我们邀请了 Tubi 技术团队的许多资深工程师,听他们分享了作为资深工程师的一些故事。今天,我们将镜头转向那些在 Tubi 担任 Tech Lead 的工程师,他们选择了在独立开发之外,承担一定的技术管理工作: …

计算机网络——计算机网络体系结构(1/4)-常见的计算机网络体系结构(OSI体系、TCP/IP体系、原理体系五层协议)

目录 OSI体系结构 OSI体系介绍 OSI失败的原因 TCP/IP体系结构 TCP/IP概述 网络接口层 网际层 运输层 应用层 TCP/IP命名的由来 原理体系结构(五层协议) OSI体系结构 OSI体系介绍 著名的“开放系统互连参考模型”,简称为OSI。该模…

Windows下Qt读取系统的内存、CPU、GPU等使用信息

一、前言 在当今计算机应用广泛的领域中,了解系统的内存、CPU和GPU使用情况是非常重要的。对于开发人员和系统管理员来说,准确获取这些信息可以帮助他们优化软件性能、诊断问题并做出相应的调整。在Windows平台上实现这一目标会涉及到调用Windows系统AP…

Apifox 学习笔记 - 前置操作之:动态更新请求体中的时间戳

Apifox 学习笔记 - 前置操作之:动态更新请求体中的时间戳 1. 在前置操作中添加一个:自定义脚本或公共脚本2. 定义我们所需的环境变量。3. 在请求参数中使用【时间戳】4. 检验参考资料 1. 在前置操作中添加一个:自定义脚本或公共脚本 2. 定义我…

WPF DataGrid详细列表手动显示与隐藏

设置显示序号与折叠显示样式 <DataTemplate x:Key"dtNum"><Button BorderBrush"Transparent" Style"{x:Null}" Click"BtnRowDetail_ShowHideClick" FontSize"16" Background"Transparent"><Stack…

Dubbo从0到1——万字完整学习笔记

目录 RPC理论概述 RPC的基本思想 RPC的实现组成部分 RPC的实现流程 RPC的核心思想 RPC调用分类 初识Dubbo Dubbo特性 Dubbo设计架构 zookeeper环境搭建 搭建注册中心环境 搭建监控中心环境 Dubbo入门案例(Dubbo Spring) 实现步骤 搭建中介者组件共享资源 打包为jar&#xf…

京东数据接口:京东数据分析怎么做?

电商运营中数据分析的重要性不言而喻&#xff0c;而想要做数据分析&#xff0c;就要先找到数据&#xff0c;利用数据接口我们能够更轻松的获得比较全面的数据。因此&#xff0c;目前不少品牌商家都选择使用一些数据接口来获取相关电商数据、以更好地做好数据分析。 鲸参谋电商…

[0xGameCTF 2023] web题解

文章目录 [Week 1]signinbaby_phphello_httprepo_leakping [Week 2]ez_upload [Week 1] signin 打开题目&#xff0c;查看下js代码 在main.js里找到flag baby_php <?php // flag in flag.php highlight_file(__FILE__);if (isset($_GET[a]) && isset($_GET[b])…

2023年中国家纺行业研究报告

第一章 行业概况 1.1 定义 家纺行业&#xff0c;即家用纺织品行业&#xff0c;是纺织业中的一个重要分支&#xff0c;它与服装用纺织品和产业用纺织品共同构成了纺织业的三大支柱。家纺不仅仅是家庭生活中的必需品&#xff0c;更是居室装饰中不可或缺的元素&#xff0c;被誉为…

Java多线程篇(11)——BlockingQueue(优先级阻塞,延迟队列)

文章目录 1、PriorityBlockingQueue2、DelayQueue 1、PriorityBlockingQueue 优先级阻塞队列就是在优先级队列的基础上增加队列排序的功能&#xff0c;将高优先级排在前面&#xff0c;所以优先级队列的元素需要实现Comparator接口。 如果数据结构用数组去维护队列的话&#xf…

uniapp系列-图文并茂教你配置uniapp开发环境

环境安装 1. 安装 node.js (版本 18/16) 在搭建 Vue 开发环境之前&#xff0c;请先下载 node.js。 Node 可从官方网站下载&#xff0c;也可从中文网站下载。根据你的电脑选择 32 位 或 64 位。网站&#xff1a; Node 或者访问 历史版本 查看 node 版本 C:\Users> node -…

超级干货 | 数据平滑9大妙招(python版)

大家好&#xff0c;对数据进行平滑处理的方法有很多种&#xff0c;具体的选择取决于数据的性质和处理的目的。今天给大家分享9大常见数据平滑方法&#xff1a; 移动平均Moving Average 指数平滑Exponential Smoothing 低通滤波器 多项式拟合 贝塞尔曲线拟合 局部加权散点平…

【python海洋专题二十一】subplots共用一个colorbar

上期读取subplot&#xff0c;并出图 但是存在一些不完美&#xff0c;本期修饰 本期内容 共用colorbar 1&#xff1a;未共用colorbar 共用colorbar 1&#xff1a;横 2&#xff1a;纵 关键语句 图片 cb_ax fig.add_axes([0.15, 0.02, 0.6, 0.03]) #设置colarbar位置 cbar …

切换npm的版本

1、在配置环境变量的地址中&#xff0c;多准备几个已解压版本的node 2、要想升降版本直接更改该文件中的文件夹名称就行 环境变量中的path的值是不用变的C:\Program Files\nodejs

Leetcode 剑指 Offer II 048. 二叉树的序列化与反序列化

题目难度: 困难 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#…

商品分类代码

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>商品分类代码</title> <script type"text/javascript"> function MM_preloadImages() { //v3.0var ddocument; if(d.images){ if(!d.MM_p) d.MM_p…

5+甲基化+预后模型搭配实验

今天给同学们分享一篇甲基化预后模型实验的生信文章“Six immune-related promising biomarkers may promote hepatocellular carcinoma prognosis: a bioinformatics analysis and experimental validation”&#xff0c;这篇文章于2023年3月23日发表在Cancer Cell Int期刊上&…

三极管和MOS如何导通

三极管类型 原理图分析三极管&#xff0c;先看看它是什么类型&#xff0c;是PNP还是NPN。 一般通过看E极&#xff08;发射极&#xff09;流向&#xff0c;从B&#xff08;基极&#xff09;到E&#xff08;发射极&#xff09;为NPN。从E&#xff08;发射极&#xff09;到B&…