位置: 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属性(表单验证用什么方法实现)

  • qq在哪设置声纹气泡(qq在哪设置声音)

    qq在哪设置声纹气泡(qq在哪设置声音)

  • 苹果手机悬浮球不见了如何恢复(苹果手机悬浮球怎么显示)

    苹果手机悬浮球不见了如何恢复(苹果手机悬浮球怎么显示)

  • 电信宽带有没有按月的(电信宽带有没有安装费)

    电信宽带有没有按月的(电信宽带有没有安装费)

  • 数据线发热有危险吗(数据线头发热)

    数据线发热有危险吗(数据线头发热)

  • 华为手机隐私空间占内存吗(华为手机隐私空间密码忘了怎么办)

    华为手机隐私空间占内存吗(华为手机隐私空间密码忘了怎么办)

  • 美标耳机和国标区别(美标耳机和国标耳机通用吗)

    美标耳机和国标区别(美标耳机和国标耳机通用吗)

  • 小米note充不进电一直亮红灯(小米note充不进电一直闪红灯)

    小米note充不进电一直亮红灯(小米note充不进电一直闪红灯)

  • 电脑白屏怎么强制退出(电脑白屏怎么强制退出没有运行程序)

    电脑白屏怎么强制退出(电脑白屏怎么强制退出没有运行程序)

  • 9.7寸的ipad有几种型号(9.7寸ipad多少厘米)

    9.7寸的ipad有几种型号(9.7寸ipad多少厘米)

  • 联通iptv卡顿解决方法(联通iptv 卡)

    联通iptv卡顿解决方法(联通iptv 卡)

  • 网络拒绝加入什么意思(网络显示拒绝加入什么意思?)

    网络拒绝加入什么意思(网络显示拒绝加入什么意思?)

  • 华为手机不能截屏了怎么回事(华为手机不能截屏涉及隐私怎么破解)

    华为手机不能截屏了怎么回事(华为手机不能截屏涉及隐私怎么破解)

  • 国行xs是哪的基带(国行iphonexs是什么基带)

    国行xs是哪的基带(国行iphonexs是什么基带)

  • 卖家未发货可以退款成功吗(卖家未发货可以确认收货吗)

    卖家未发货可以退款成功吗(卖家未发货可以确认收货吗)

  • 快手删作品会影响权重(快手删作品会影响浏览吗)

    快手删作品会影响权重(快手删作品会影响浏览吗)

  • 怎么在酷我音乐上录歌曲(怎么在酷我音乐下载歌曲到u盘)

    怎么在酷我音乐上录歌曲(怎么在酷我音乐下载歌曲到u盘)

  • 表示团结一致的谚语(表示团结一致的词语四字词语)

    表示团结一致的谚语(表示团结一致的词语四字词语)

  • 苹果x壁纸怎么缩小(苹果x壁纸怎么换回原来)

    苹果x壁纸怎么缩小(苹果x壁纸怎么换回原来)

  • vivox27手机能扫脸解锁吗(vivo手机有没有扫描功能,怎么用?)

    vivox27手机能扫脸解锁吗(vivo手机有没有扫描功能,怎么用?)

  • 魅蓝5s恢复出厂设置在哪里(魅蓝5s恢复出厂设置密码)

    魅蓝5s恢复出厂设置在哪里(魅蓝5s恢复出厂设置密码)

  • 讯飞输入法如何设置盲打(讯飞输入法如何关闭键盘声音)

    讯飞输入法如何设置盲打(讯飞输入法如何关闭键盘声音)

  • 魅族16如何重启(魅族16重启键是哪个)

    魅族16如何重启(魅族16重启键是哪个)

  • 从零开始,三分钟内用Python快速自建一个私有化 ChatGpt 聊天机器人网站(从零开始文章)

    从零开始,三分钟内用Python快速自建一个私有化 ChatGpt 聊天机器人网站(从零开始文章)

  • phpcms如何添加视频(phpcms怎么用)

    phpcms如何添加视频(phpcms怎么用)

  • python字符的获取方式(python获取字符串中汉字的个数)

    python字符的获取方式(python获取字符串中汉字的个数)

  • 应交税费应交增值税明细账怎么填
  • 核定征收企业所得税暂行办法
  • 查账征收纳税申报表
  • 报税怎么操作流程图
  • 股权转让如何交税
  • 所得税残疾人工资加计扣除
  • 员工为公司垫付款项
  • 做电商没有进货码怎么办
  • 非税收入一般缴款书一式几联
  • 一般纳税人拿到小规模的专票
  • 房地产开发企业预缴增值税
  • 申报个税大病医疗如何申报
  • 流转税收入怎么算
  • 印花税账务处理
  • 可变股权转让对价会计处理怎么做?
  • 运输公司租入的车辆如何核算
  • 电子发票对航天信息利空吗
  • 冲红的电子发票要怎么处理
  • 没有核定税种怎么报税
  • 如何理解消费税的作用
  • 个体户一个月开票30万怎么上税
  • 旧房转让土地增值税核定
  • 企业注销后资金处理
  • 子公司能转让吗
  • u盘如何进行杀毒
  • 企业老板机票怎么报销记账
  • 合同作废印花税法规定
  • 查账补缴的税的账怎么做
  • 销货退回与折让是什么
  • 用银行存款支付明年的财产保险费
  • php str函数
  • 筹建期银行手续费
  • 销售不动产应交的增值税计入
  • php lee
  • 表单的基本语法格式
  • 前端页面默认字体
  • 房地产行业预售制度
  • php注册和登录界面
  • 购买固定资产后如何处理
  • 华为od测试岗机试需要怎么准备
  • mysql+php
  • 自制原始凭证代码怎么填
  • 政府代建项目税收政策
  • 附清单格式
  • 多缴纳的社保怎么查询
  • 维修费应该计入什么科目
  • 个人所得税应补退税额怎么查
  • 存货跌价准备怎么核算
  • 更正申报季度企业所得税
  • 固定资产入账和未入账的区别
  • 法人转让股权,可以打个人账户吗
  • 计算企业所得税可以扣除的税金
  • 营改增后劳务派遣公司账务处理
  • 海关被税没有发票
  • 暂估入库怎么处理
  • 房屋租赁合同怎么写对房东有利
  • 转账支票办理收款所要拿的单证
  • 中药饮片盘点损耗率 法律
  • 注销企业基本户销户规定
  • 总帐参数怎么设置
  • sql server233错误
  • WINDOWS7系统安装包
  • windows开始搜索栏
  • windows怎么定位
  • linux 命令详解
  • root linux
  • dyservice.exe是什么
  • win7系统播放器在哪
  • win10更新后qq打不开
  • 感恩节0
  • java的gui框架
  • unity learn premium
  • jquery 列表控件
  • bash特殊符号
  • 一张监控
  • 深入理解python特性
  • 税务大厅买票需要什么东西
  • 进口设备应缴纳的关税
  • 河南省2020年12月纳税申报截止日期
  • 开展志愿服务关爱活动
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设