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

  • 微信公众号增粉技巧大合集!(微信公众号增粉优先微媒网赞赏)

    微信公众号增粉技巧大合集!(微信公众号增粉优先微媒网赞赏)

  •  中小企业网络营销十项实战技巧(中小企业网络安全解决方案)

    中小企业网络营销十项实战技巧(中小企业网络安全解决方案)

  • 成都金牛区代理记账专业靠谱_透明消费_最低报价(成都金牛区电话号码)

    成都金牛区代理记账专业靠谱_透明消费_最低报价(成都金牛区电话号码)

  • oppo手机怎么调视频美颜功能(oppo手机怎么调震动)

    oppo手机怎么调视频美颜功能(oppo手机怎么调震动)

  • 荣耀手环4running版如何测心率(荣耀手环4running版充电没反应)

    荣耀手环4running版如何测心率(荣耀手环4running版充电没反应)

  • 苹果x换了国产屏跳屏(苹果x换了国产屏很花)

    苹果x换了国产屏跳屏(苹果x换了国产屏很花)

  • 怎么把照片放在一张图上(怎么把照片放在u盘里)

    怎么把照片放在一张图上(怎么把照片放在u盘里)

  • 安卓手机m4v用什么打开(m4v格式安卓能打开吗)

    安卓手机m4v用什么打开(m4v格式安卓能打开吗)

  • 手机烧屏保修吗(手机烧屏保修吗?)

    手机烧屏保修吗(手机烧屏保修吗?)

  • cpu二手的和新的区别大吗(全新cpu和二手cpu)

    cpu二手的和新的区别大吗(全新cpu和二手cpu)

  • 笔记本快捷键关机(笔记本快捷键关闭键盘)

    笔记本快捷键关机(笔记本快捷键关闭键盘)

  • 机械键盘rgb什么意思(机械键盘rgb什么时候开)

    机械键盘rgb什么意思(机械键盘rgb什么时候开)

  • 电脑老是卡死没反应是怎么回事(电脑老是卡死没有反应)

    电脑老是卡死没反应是怎么回事(电脑老是卡死没有反应)

  • 爱奇艺转播春晚吗(2021爱奇艺直播春晚)

    爱奇艺转播春晚吗(2021爱奇艺直播春晚)

  • iphone7上市时间(iphone7上市时间中国)

    iphone7上市时间(iphone7上市时间中国)

  • 苹果手机备忘录涂鸦怎么删(苹果手机备忘录误删怎么恢复)

    苹果手机备忘录涂鸦怎么删(苹果手机备忘录误删怎么恢复)

  • 华为mate30卡槽有几个(华为mate30卡槽有个三角凸起)

    华为mate30卡槽有几个(华为mate30卡槽有个三角凸起)

  • 在大数据时代数据使用的关键是什么(在大数据时代数据可以产生价值提升产业的竞争力)

    在大数据时代数据使用的关键是什么(在大数据时代数据可以产生价值提升产业的竞争力)

  • oppo手机桌面时钟怎么弄(oppo手机桌面时间怎么调成横着的)

    oppo手机桌面时钟怎么弄(oppo手机桌面时间怎么调成横着的)

  • 怎么登录人人视频tv版(人人视频怎么游客登录)

    怎么登录人人视频tv版(人人视频怎么游客登录)

  • iphonex是2k吗(iphonex是2.5d屏幕吗)

    iphonex是2k吗(iphonex是2.5d屏幕吗)

  • 小米手环4能用热水泡吗(小米手环4能用4G吗)

    小米手环4能用热水泡吗(小米手环4能用4G吗)

  • 58同城为啥要人脸认证(58同城为啥要人脸验证)

    58同城为啥要人脸认证(58同城为啥要人脸验证)

  • element-UI组件之日期时间选择器与时间格式转化(element_ui)

    element-UI组件之日期时间选择器与时间格式转化(element_ui)

  • Cesium加载离线地图和离线地形(cesium加载s3m)

    Cesium加载离线地图和离线地形(cesium加载s3m)

  • 不动产租赁税率2023
  • 当月购入固定资产计提折旧吗
  • 以公允价值计量计入其他综合收益
  • 职工报销的医药费计入什么科目
  • 飞机票退票费如何记账
  • 个体工商户免征税额度是多少
  • 现金流量表中支付的税费包括哪些
  • 安全基金提取标准
  • 解除合同补偿金需要缴纳个税吗
  • 公司购买网络交换机入什么会计科目
  • 承包费收入计入什么科目
  • 房地产行业零税率发票
  • 车辆购置税固定资产
  • 所得税税负率是多少
  • 增值税专票代码TZD0085什么意思
  • 银行利息现金流量表什么科目
  • 预收账款属于金融资产吗为什么
  • 第二年缴纳税控盘服务费入什么科目?
  • 动车票的税进行抵扣该填写在哪里
  • 资本公积转增资本什么意思
  • 购买基金会计核算
  • 发出商品与库存商品的区别
  • 预付业务招待费会计分录
  • 腾讯电脑管家浏览器保护在哪
  • win7显示更新失败怎么办啊
  • Win10无法访问局域网计算机
  • 出租车发票没有发票专用章是否能报销
  • PHP:session_set_save_handler()的用法_Session函数
  • 在网上怎
  • 三元运算符判断闰年php
  • 增值税发票没认证 可以重新开吗
  • 铁路运输企业受托代征的印花税款信息
  • thinkphp验证码刷新
  • 适用加计抵减政策需要提交什么资料
  • vue 实战
  • 负数发票跨月怎么做账
  • vue3用法
  • 异常处理流程为哪几个部分
  • 增值税附加税减免政策2022年
  • 基本户往一般户转钱有限制吗
  • 赔偿的费用
  • 钢管租赁行业会计账务处理
  • 增值税发票丢失怎么补开
  • 房东房租不开票违法吗
  • 一般纳税人提供财政部和国家税务总局规定的
  • 基本社会保险制度范围
  • 经营活动现金流量净额是什么意思
  • 固定资产折旧提头不提尾
  • 增值税多缴税款可以抵缴以后
  • 高新企业预缴增值税税率
  • 不是销售性质的工作
  • 企业每月利润多少合适
  • 会计凭证的填制与审核实训总结
  • 增值税涉及的税目有哪些
  • 借方记录什么的增加
  • 收到注册资本金什么时候交印花税
  • 小微企业免税如何做账
  • 合资注册公司应该注意什么
  • 企业对外购和自己的区别
  • centos安装ntfs 3g
  • winxp系统连接网络
  • win10声音突然变得很沉闷
  • win10预览版21277
  • linux,Centos5,Ubuntu关掉ipv6的方法
  • windows time同步系统时间的服务无法启动报错1058解决方法
  • win7小技巧
  • win7找回删除的文件
  • ES6 javascript的异步操作实例详解
  • jquery添加css样式
  • cocos2048
  • javascript如何学
  • android的消息机制
  • 浏览器url怎么看
  • javascript中函数
  • jquery常见问题
  • 2016年最火的歌曲排行榜前十名
  • 残疾人个人所得税减免政策
  • 一般纳税人开劳务费税率是多少2023
  • 发票开票人一定要真实姓名吗
  • 国税工作人员工资标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设