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

  • 如何删除淘宝好友(如何删除淘宝好友共享清单)

    如何删除淘宝好友(如何删除淘宝好友共享清单)

  • 一加七和pro有啥区别(一加七和pro的区别)

    一加七和pro有啥区别(一加七和pro的区别)

  • 爱奇艺突然没声音了(爱奇艺突然没声音还卡)

    爱奇艺突然没声音了(爱奇艺突然没声音还卡)

  • 笔记本风扇不转后果(笔记本风扇不转怎么办)

    笔记本风扇不转后果(笔记本风扇不转怎么办)

  • 小米管理员密码是什么意思(小米管理员密码是什么)

    小米管理员密码是什么意思(小米管理员密码是什么)

  • p30有没有无线充电功能(p30手机有没有无线充电)

    p30有没有无线充电功能(p30手机有没有无线充电)

  • dvdrom属于什么储存器(dvd rom属于什么)

    dvdrom属于什么储存器(dvd rom属于什么)

  • vivo插上耳机经常弹出小v(vivo插上耳机经常弹出jovi)

    vivo插上耳机经常弹出小v(vivo插上耳机经常弹出jovi)

  • ip44级防水是什么意思(ip44防水等级是什么)

    ip44级防水是什么意思(ip44防水等级是什么)

  • 为什么降噪耳机有耳压(为什么降噪耳机会头晕)

    为什么降噪耳机有耳压(为什么降噪耳机会头晕)

  • ipad平板2018支持otg吗(ipad 支持)

    ipad平板2018支持otg吗(ipad 支持)

  • soul灵魂匹配是语音吗(soul灵魂匹配是什么歌)

    soul灵魂匹配是语音吗(soul灵魂匹配是什么歌)

  • 钢化膜可以盖住划痕吗(钢化膜可以盖住手机划痕吗)

    钢化膜可以盖住划痕吗(钢化膜可以盖住手机划痕吗)

  • 手机自动回复怎么设置(手机自动回复怎么设置 微信)

    手机自动回复怎么设置(手机自动回复怎么设置 微信)

  • 键盘的长宽尺寸是多少(键盘的长宽尺寸怎么调)

    键盘的长宽尺寸是多少(键盘的长宽尺寸怎么调)

  • 显卡装在什么位置(显卡装在什么位置最好)

    显卡装在什么位置(显卡装在什么位置最好)

  • 探探怎么看喜欢我的人(探探怎么看喜欢的人的信息)

    探探怎么看喜欢我的人(探探怎么看喜欢的人的信息)

  • 华为锁屏时间怎么设置(华为锁屏时间怎么去掉)

    华为锁屏时间怎么设置(华为锁屏时间怎么去掉)

  • 日版苹果11是双卡双待吗(日版苹果11是双卡吗)

    日版苹果11是双卡双待吗(日版苹果11是双卡吗)

  • 补手机号码卡号变吗(补手机卡号要钱吗)

    补手机号码卡号变吗(补手机卡号要钱吗)

  • 苹果为什么不卡(苹果为什么不卡顿)

    苹果为什么不卡(苹果为什么不卡顿)

  • 荣耀8x游戏模式在哪(华为荣耀8x的游戏模式在哪里)

    荣耀8x游戏模式在哪(华为荣耀8x的游戏模式在哪里)

  • 华为nova3i充电器型号(华为nova3i充电器参数)

    华为nova3i充电器型号(华为nova3i充电器参数)

  • 无线路由器1、2、3根天线有什么区别(无线路由器1200m覆盖范围)

    无线路由器1、2、3根天线有什么区别(无线路由器1200m覆盖范围)

  • Rust  Aya 编写 eBPF 程序(rust编程指南)

    Rust Aya 编写 eBPF 程序(rust编程指南)

  • 个人所得税手续费返还时间
  • 税务师考试给个税表吗
  • 公司每月支出
  • 中国电子口岸证书错误
  • 建筑行业异地工资怎么算
  • 月初认证的增值税发票可以吗
  • 信用减值损失贷方
  • 小微企业增值税起征点是多少
  • 土地转让如何缴纳增值税
  • 企业年金个人所得税扣除标准
  • 仓库货物破损处理方法
  • 增值税晚交一个月会怎么样
  • 加油站销售加油卡是否征收增值税
  • 高管怎么样
  • 福利费抵扣了进项税有2年了怎么办
  • 单位的审计
  • 补记去年收入分录
  • 个体工商户200万以下减半
  • 暂估运费成本的账务处理
  • 怎么更正以前年度企业所得税
  • 企业进口葡萄酒税率多少
  • 返聘人员如何缴纳个人所得税
  • 公司亏损应该从哪入手
  • macqq截图快捷键 保存
  • 国税的个税手续怎么办理
  • php如何重启
  • 福克兰群岛属于哪国
  • php对象是什么类型的数据
  • 库存股会计处理 会计视野
  • 投资收益会计准则
  • vue3项目搭建
  • php生成csv文件
  • 补交当年的增值税
  • 抽烟罚款会计分录
  • 应收款和实收款区别
  • 新旧会计准则对比
  • 企业主营业务收入净额怎么算
  • 小额支出没有发票怎么办
  • short int、long、float、double使用问题说明
  • 建筑劳务公司的进项票有哪些
  • 等线支付给劳务派遣单位的工资怎么做账?
  • 建筑发票开具与土增税扣有什么关系?
  • 核定征收适用于什么税率
  • 企业借款利息如何计算
  • 已经认证抵扣的发票,要退回,怎么处理
  • 员工入股会计分录
  • 自己开发自己施工
  • 应收账款多出来的钱记到什么科目
  • 发票缴销了还能恢复吗
  • 支付贷款利息属于筹资活动吗
  • 商品销售方式
  • 投资款没有进入公司账户算投资款吗
  • 建账选用什么会计制度
  • 外资房地产企业 利润汇出比例
  • 公司的私账
  • sql server 判断数据是否存在
  • mysql配置怎么调出来
  • linux常用帮助命令
  • centos7挂载cdrom
  • centos7怎么查看磁盘空间
  • win10预览版绿屏重启解决
  • win10系统预览版
  • win8磁盘分区合并
  • win8怎么打开蓝牙设置
  • linux测试软件
  • dpd参数
  • linux系统安装软件教程
  • 观察者模式的应用
  • drawcalls2000多
  • 猜猜这关怎么过攻略
  • Unity3D游戏开发基础
  • wordpress单页面店铺
  • 深圳地方税务局电话
  • 查账征收个人经营所得税怎么申报
  • 移动办税12366
  • 河北个体工商户年报入口
  • 苏州地方税务
  • 上海金山国税局局长
  • 购买税控设备
  • 消费税记不记入成本
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设