位置: IT常识 - 正文

没有关系的话,那就去建立关系吧(没有关系怎么表达)

编辑:rootadmin
没有关系的话,那就去建立关系吧

推荐整理分享没有关系的话,那就去建立关系吧(没有关系怎么表达),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:没有关系的关系说说,没有关系的话形容,没有关系的话就没关系了,没有关系的话怎么说,没有关系的话怎么表达,没有关系的话怎么说,没有关系的话,zhao句,没有关系的话形容,内容如对您有帮助,希望把文章链接给更多的朋友!

        今天给大家分享一道链表的好题--链表的深度拷贝,学会这道题,你的链表就可以达到优秀的水平了。力扣

         先来理解一下题目意思,即建立一个新的单向链表,里面每个结点的值与对应的原链表相同,并且random指针也要指向新链表中与原链表对应的那个相对位置。(即假设原链表中的第一个结点的random指向原链表的最后一个结点,那么新链表的第一个结点也要指向新链表的最后一个结点,即random指针是链表内部确定相对位置的一个指针)。

        首先,拷贝一个新的链表,其对应结点的值与原链表对应结点的值相同是很容易实现的。可以用一个cur指针遍历原链表,然后建立一个新链表头,然后逐个尾插既可。   

struct Node* cur=head; struct Node* newhead = NULL; struct Node* tail = NULL; while(cur) { //每次尾插都需要一个新结点,其val与原链表对应相等 struct Node* newnode = (struct Node*)malloc(sizeof(struct Node)); //第一次尾插时 if(NULL ==tail) { newhead = tail =newnode; newnode->val = cur->val; newnode->next = newnode->random = NULL; } //后续尾插 else { tail->next = newnode; tail = tail->next; } //拷贝一个新结点后,cur往后走 cur = ucr->next; }

此时,只是完成了next链接和val拷贝,random的指向还没有拷贝。

暴力求解O(N^2)

可以建立一个结构体的指针数组   struct Node* arr[n]  n为原链表中的结点数

struct Node* arr[n]; int count = 0; while(cur) { arr[count] = cur->random; count++; cur =cur->next; }

再次利用cur遍历原链表,将每个结点的random保存在创建的结构体指针数组 arr中。

struct Node* newcur=newhead; int newcount=-1; while(newcur) { ++newcount;//每次进来都拿到原链表的一个random struct Node* tmp = arr[newcount];//用tmp保存这个random cur = head; while(cur != tmp) { //遍历原链表,看看此时的random是原链表的第几个结点 count++; } //找到新链表中对应的第count个结点 struct Node* find = newhead; while(count--) { //一共走count步 newhead = newhead->next; } //找到了newcur位置的random的指向 newcur->random = find; //newcur继续往后走 newcur = newcur->next; }

暴力解法虽然也能解决问题,但是时间复杂度为O(N^2),效率低,不推荐。

更优解O(N)

        通过暴力解法我们可以发现,寻找random指向的难点在于它是随机的,如果想要确定具体的相对位置(相对于头是第几个)则必须经过2次遍历,那么怎样简化寻找相对位置的过程呢?

没有关系的话,那就去建立关系吧(没有关系怎么表达)

        想一下random的关系在哪里出现,应该只有原链表中,而我们又想要建立新链表中random的关系,因此我们必须建立原链表与新链表直接的关系,通过原链表的random找到新链表的random。

        再借助next指针思考,我们可以将新链表对应的结点连接到原链表上。

        

 此时逻辑一下子清晰了,每个新结点都在原对应结点的next位置。

例如:对于13这个结点的random连接,新13->random = 原13->random->next,即通过原链表random的查找方式,再加上next,来连接新链表的random。

具体的实现过程分为3个方面。

1、连接原、新链表 struct Node* cur=head; while(cur) { //建立新结点并初始化 struct Node* newnode = (struct Node*)malloc(sizeof(struct Node)); newnode->next = newnode->random =NULL; random->val = cur->val; //先保存一下原结点的下一个结点 struct Node* next = cur->next; //将新结点连接到原链表 cur->next = newnode; newnode->next = next; //cur继续往后走 cur = next; }2、建立新链表的random联系 cur = head; while(cur) { //确保cur不为NULL,再建立copy指向cur的next struct Node* copy = cur->next; //建立copy的random联系时,要确保其不为空,否则不能进行next操作 //因此这里讨论一下原链表的random是否为空 if(NULL == cur->random) { copy->random = NULL; } else { copy-> random = cur->random->next; } //连接后cur继续往后走 cur = copy->next; }

要注意,copy指针和cur指针移动的位置,可以理解为cur不为空时,建立copy指向此时cur的下一个,完成相关连接后copy丢弃,cur往后走,copy只起到临时变量的作用(连接后便丢弃)。

3、分离原、新链表

分离的过程直接将copy部分的结点尾插到一个新结点即可

struct Node* newhead=NULL,*tail=NULL; cur=head; while(cur) { struct Node* copy = cur->next; struct Node* next = copy->next; if(NULL == tail)//第一次尾插 { newhead = tail =copy; } else//后续尾插 { tail->next = copy; //tail往后走,指向新的最后一个结点 tail = tail->next; } //分离原链表,cur继续往后走 cur->next=next; cur= next; } return newhead;

这部分要注意,else内部tail往下走是后续尾插才有的操作。

总结:为了优化代码,使时间复杂度变为O(N),必须建立原来链表的新链表直接的联系,借助原链表的random->next,来连接新链表的random。

所以说,没有关系的话,那就去勇敢的建立关系吧。

本文链接地址:https://www.jiuchutong.com/zhishi/298428.html 转载请保留说明!

上一篇:Vue3中的父传子和子传父如何实现(vue3父子传值)

下一篇:结合表单验证谈el-form中model、prop、rules属性(表单验证用什么方法实现)

  • 国家企业信用信息公示系统

    国家企业信用信息公示系统

  • iPhone自带型号名称怎么修改(iphone型号名称)

    iPhone自带型号名称怎么修改(iphone型号名称)

  • iphone有自带的地震预警吗(iphone有自带的地震预警我的老师好撩人)

    iphone有自带的地震预警吗(iphone有自带的地震预警我的老师好撩人)

  • 苹果xsmax的屏幕失灵(苹果xsmax的屏幕尺寸长宽各多少)

    苹果xsmax的屏幕失灵(苹果xsmax的屏幕尺寸长宽各多少)

  • 一寸蓝底电子照片怎么弄(一寸蓝底电子照片尺寸)

    一寸蓝底电子照片怎么弄(一寸蓝底电子照片尺寸)

  • 快手一块币是什么意思(快手上的一块币是多少钱呢)

    快手一块币是什么意思(快手上的一块币是多少钱呢)

  • b站硬币在哪里领(b站硬币在哪里签到)

    b站硬币在哪里领(b站硬币在哪里签到)

  • 微信必须实名认证吗(微信必须实名认证绑定银行卡吗)

    微信必须实名认证吗(微信必须实名认证绑定银行卡吗)

  • 店铺被淘宝永久封申诉成功率(淘宝店铺被永久封怎么解决)

    店铺被淘宝永久封申诉成功率(淘宝店铺被永久封怎么解决)

  • 苹果深色模式怎么打开(苹果深色模式怎么放在控制中心)

    苹果深色模式怎么打开(苹果深色模式怎么放在控制中心)

  • whatsapp时间不准确要怎么弄呢(whatsapp时间不标准)

    whatsapp时间不准确要怎么弄呢(whatsapp时间不标准)

  • 计算机性能主要取决于(计算机性能主要指标是指)

    计算机性能主要取决于(计算机性能主要指标是指)

  • 苹果11膜和什么型号通用   (苹果11膜和什么膜通用)

    苹果11膜和什么型号通用 (苹果11膜和什么膜通用)

  • ipad可以连接蓝牙音响吗(iPad可以连接蓝牙手柄吗)

    ipad可以连接蓝牙音响吗(iPad可以连接蓝牙手柄吗)

  • 手机怎样看汽车违章(手机怎样看汽车还款记录)

    手机怎样看汽车违章(手机怎样看汽车还款记录)

  • 网易云收藏的歌单在哪(网易云收藏的歌单怎么隐藏)

    网易云收藏的歌单在哪(网易云收藏的歌单怎么隐藏)

  • 抖音直播怎么关闭礼物特效(抖音直播怎么关闭)

    抖音直播怎么关闭礼物特效(抖音直播怎么关闭)

  • 快手直播竞猜在哪(快手主播竞猜哪里竞猜)

    快手直播竞猜在哪(快手主播竞猜哪里竞猜)

  • 快手开店用淘宝还是魔筷(在快手开店好还是在淘宝开店好)

    快手开店用淘宝还是魔筷(在快手开店好还是在淘宝开店好)

  • 移动网络电视怎么回放呢(移动网络电视怎么调到正常电视台)

    移动网络电视怎么回放呢(移动网络电视怎么调到正常电视台)

  • 无线网络接入技术的特点(无线网络接入技术的指标有)

    无线网络接入技术的特点(无线网络接入技术的指标有)

  • 苹果怎么删除一个面容id(苹果怎么删除一页桌面)

    苹果怎么删除一个面容id(苹果怎么删除一页桌面)

  • 下载管理器在哪

    下载管理器在哪

  • fsg.exe是什么进程 作用是什么  fsg进程查询(igfxem.exe是什么进程)

    fsg.exe是什么进程 作用是什么 fsg进程查询(igfxem.exe是什么进程)

  • 织梦列表使用ajax点击加载更多(织梦网站怎么添加关键词)

    织梦列表使用ajax点击加载更多(织梦网站怎么添加关键词)

  • 出口免税进项税额转出怎么计算
  • 空调安装维修费会计科目
  • 要交多少增值税
  • 无需外汇局审批的账户
  • 捐赠支出需要什么手续
  • 公司买的电器可以抵扣吗
  • 财政补贴交不交印花税
  • 财务费用为什么借方红字
  • 食品销售税务起征点是多少
  • 增值税专用发票税额怎么抵扣
  • 价外补贴需要交增值税吗
  • 固定资产盘点账实不符
  • 资产划转涉税解读
  • 行政性罚款可以扣除吗
  • 商誉转销会计分录
  • 公司收到一次性吸纳就业补贴款怎么分录
  • 当月勾选认证的原材料与当月领用的原材料区别
  • 支付各种办公费用
  • 固定资产减值准备增加记哪方
  • 非独立核算的分公司是什么意思
  • 营改增的增值税税率
  • 小型微利企业所得税优惠政策2022
  • 营改增后建筑业税率变化情况
  • 同一笔销售业务的收入和成本
  • 上级工会返还的会计分录
  • 注销一定要去营业厅吗
  • 公司帮员工买的保险
  • 计提税金和缴纳税金的会计分录
  • 旅客运输抵税
  • 以货抵债会计处理
  • 收支利息税务如何处理
  • 员工交通费报销标准
  • 预计负债什么时候确认
  • 公司买厨房用品计入什么科目
  • 企业怎么通过债务转让
  • 待清算专户
  • thinkphp5开发教程
  • 个体户年报如何公示
  • Win11安装失败怎么办
  • 承租人对经营租赁和融资租赁会计处理方式
  • php实现ping功能
  • 在php中,字符串有哪些表示形式
  • vue3+ts写法
  • 车间的办公费计入
  • php查询mysql数据库
  • 罚款支出可以抵扣所得税吗
  • 预算周转金会计处理怎么做
  • 原生php和框架php的区别
  • 办营业执照怎么填写经营范围
  • 乘客人身意外保险单可以报销吗
  • 恢复mysql数据库
  • 政府补助是否可以抵扣
  • 公司买的茶叶怎么入账
  • 股东捐赠给企业怎么做账
  • 直接减免税款的例子
  • 投资款项是什么意思
  • 营改增后建筑企业税负不降反增
  • 支票填写的规范与常识
  • 硬盘uefi启动安装系统
  • Win10系统如何开启全部权限
  • xp系统的硬盘装到win7电脑
  • 开机停在american megatrends
  • windows time同步系统时间的服务无法启动报错1058解决方法
  • Win10系统如何使用无线网卡上网 win10台式机使用无线网卡上网的两种方法图文教程
  • win10推送win11
  • win8设置宽带连接
  • msp sncp
  • 谷歌浏览器点更新没反应
  • linux小技巧
  • css一个页面跳转到另一页面
  • javascript零基础
  • node.js中fs模块
  • jquery获取当前对象
  • shell echo 特殊字符
  • unity3d初学者教程视频
  • js中倒计时器怎么实现
  • 江西省税务局拟录用人员公示
  • 装卸搬运服务是什么服务
  • 信息技术税务分类编码
  • 出口退税网上申报流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设