OJ第三篇

文章目录

  • 随机链表的复制

随机链表的复制

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

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

这道题的难点是原链表中那个随机指针的指向在新链表中并不能用,你得找到新链表中对应的那个位置才可以,当然我们可以暴力求解,就是先复制链表的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;}//处理拷贝结点的randomcur=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.mzph.cn/news/103768.shtml

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

相关文章

深入了解基数排序:原理、性能分析与 Java 实现

基数排序(Radix Sort)是一种非比较性排序算法,它根据元素的每个位上的值来进行排序。基数排序适用于整数或字符串等数据类型的排序。本文将详细介绍基数排序的原理、性能分析及java实现。 基数排序原理 基数排序的基本原理是按照低位先排序&…

基于PLC的机械手控制系统设计

目录 摘 要......................................................................................................................... 1 第一章 绪论.............................................................................................................…

vue中的生命周期有什么,怎么用

Vue.js 的生命周期(lifecycle)是指 Vue 实例从创建到销毁的整个过程。Vue.js 常用的生命周期包括: beforeCreate:在实例被创建之前调用,此时组件的数据观测和事件机制都未被初始化。created:在实例创建完成…

【Acwing187】导弹防御系统(LIS+剪枝+贪心+dfs+迭代加深)

题目描述 看本文需要准备的知识 1.最长上升子序列(lis)的算法思想和算法模板 2.acwing1010拦截导弹(lis贪心)题解 本题题解,需要知道这种贪心算法 3.简单了解dfs暴力搜索、剪枝、搜索树等概念 思路讲解 dfs求最…

TCP/IP(七)TCP的连接管理(四)全连接

一 全连接队列 nginx listen 参数backlog的意义 nginx配置文件中listen后面的backlog配置 ① TCP全连接队列概念 全连接队列: 也称 accept 队列 ② 查看应用程序的 TCP 全连接队列大小 实验1: ss 命令查看 LISTEN状态下 Recv-Q/Send-Q 含义附加:…

clone()方法使用时遇到的问题解决方法(JAVA)

我们平时在自定义类型中使用这个方法时会连续遇到 4 个问题。 基础代码如下: class A {int[] a {1,2,3}; }public class Test {public static void main(String[] args) {} } 第一个: 当我们直接调用时报错原因是Object类中的clone方法是被protecte…

图书管理系统的实现

一、系统的介绍 进入图书管理系统的用户分为:管理员用户和普通用户。管理员用户所执行的操作有:查找图书、新增图书、删除图书、显示图书、退出系统。普通用户所执行的操作有:查找图书、借阅图书、归还图书、退出系统。 二、各模块代码的实…

Docker数据卷操作

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UnionFS,可以提供很多有用的特性: 数据卷 可以在容器之间共享和重用 对 数据卷 的修改会立马生效 对 数据卷 的更新,不会影响镜像 数据卷 默认会一直存在,即…

Umi + React + Ant Design Pro + TS 项目搭建

新建项目目录 mkdir 【项目名称】在对应目录 D:\react\demo 中,安装 Umi 脚手架: yarn create umi接下来,安装将要用到的相关依赖 umijs/plugins: npm i umijs/plugins -Dumijs/plugins 是 Umi 的官方插件集,包含了…

Excel 数据透视表

参考: https://blog.csdn.net/weixin_47267618/article/details/118466565

每日一题AC

4.小花和小草正在沙滩上玩挖沙洞的游戏。他们划了一条长度为n米的线作为挖沙洞的参考线路,小花和小草分别从两头开始沿着划好的线开始挖洞,小花每隔a米挖一个洞,小草每隔b米挖一个洞,碰到已经挖过洞的就不需要再挖了。那么&#x…

排序算法——冒泡排序

一、介绍: 冒泡排序原理就是从第一个元素开始,比较其后边的一个元素的大小,按照排序方式进行交换位置,直到将所有元素的顺序排列好为止。演示如下: 视频演示: 冒泡排序演示_网络游戏热门视频 (bilibili.co…

Linux 安全 - DAC机制

文章目录 一、安全简介二、DAC2.1 UNIX 的自主访问控制2.2 Linux 的自主访问控制 三、进程凭证3.1 简介3.2 uid/gid3.3 系统调用 四、客体标记4.1 简介4.2 系统调用 五、UGO规则源码分析参考资料 一、安全简介 计算机系统应对安全挑战的办法大致有四种:隔离、控制、…

【Spring Boot】RabbitMQ消息队列 — RabbitMQ入门

💠一名热衷于分享知识的程序员 💠乐于在CSDN上与广大开发者交流学习。 💠希望通过每一次学习,让更多读者了解我 💠也希望能结识更多志同道合的朋友。 💠将继续努力,不断提升自己的专业技能,创造更多价值。🌿欢迎来到@"衍生星球"的CSDN博文🌿 🍁本…

GEO生信数据挖掘(七)差异基因分析

上节,我们使用结核病基因数据,做了一个数据预处理的实操案例。例子中结核类型,包括结核,潜隐进展,对照和潜隐,四个类别。本节延续上个数据,进行了差异分析。 差异分析 计算差异指标step12 加载…

蓝桥杯 题库 简单 每日十题 day13

01 乘积尾零 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将 所填结果输出即可。如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零? 5650 4542 3554 473 946 4114 3871 9073 90 …

汽车RNC主动降噪算法DSP C程序实现

汽车RNC主动降噪算法C程序 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,车载

rust 智能指针

智能指针 Box Box 的使用场景 由于 Box 是简单的封装,除了将值存储在堆上外,并没有其它性能上的损耗。而性能和功能往往是鱼和熊掌,因此 Box 相比其它智能指针,功能较为单一,可以在以下场景中使用它: 特…

Flink之DataStream API开发Flink程序过程与Flink常见数据类型

开发Flink程序过程与Flink常见数据类型 DataStream APIFlink三层APIDataStream API概述 开发Flink程序过程添加依赖创建执行环境执行模式创建Data Source应用转换算子创建Data Sink触发程序执行示例 Flink常见数据类型基本数据类型字符串类型时间和日期类型数组类型元组类型列表…