位置: 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手机怎么把旧手机的东西导入新手机)

  • edifier耳机怎么配对(edifier耳机怎么开机)

    edifier耳机怎么配对(edifier耳机怎么开机)

  • 支付宝蚂蚁花呗如何提升额度(支付宝蚂蚁花呗打电话过来是什么号码)

    支付宝蚂蚁花呗如何提升额度(支付宝蚂蚁花呗打电话过来是什么号码)

  • 微信公众号视频审核要多久(微信公众号视频怎么转发到QQ)

    微信公众号视频审核要多久(微信公众号视频怎么转发到QQ)

  • a1674是ipad什么型号(ipada1678是什么型号)

    a1674是ipad什么型号(ipada1678是什么型号)

  • 美团刷好评处罚规则

    美团刷好评处罚规则

  • 蜂窝数据漫游要打开吗(蜂窝 数据漫游)

    蜂窝数据漫游要打开吗(蜂窝 数据漫游)

  • 苹果7手机麦克风启动不成功怎么办(苹果7手机麦克风没声音怎么回事)

    苹果7手机麦克风启动不成功怎么办(苹果7手机麦克风没声音怎么回事)

  • 五福只可以集一次吗(五福只能集一次吗2021)

    五福只可以集一次吗(五福只能集一次吗2021)

  • 监控红外线坏了怎么修(监控红外线坏了晚上还能看到吗)

    监控红外线坏了怎么修(监控红外线坏了晚上还能看到吗)

  • 苹果8plus支持联通吗(苹果8plus支持wifi5吗)

    苹果8plus支持联通吗(苹果8plus支持wifi5吗)

  • 技嘉主板安全模式按哪个键(技嘉主板安全模式进不去)

    技嘉主板安全模式按哪个键(技嘉主板安全模式进不去)

  • 天河二号计算机是巨型机吗(天河二号计算机研发成功时间)

    天河二号计算机是巨型机吗(天河二号计算机研发成功时间)

  • 华为mate30pro导航键怎么设置(华为mate30pro导航声音怎么调)

    华为mate30pro导航键怎么设置(华为mate30pro导航声音怎么调)

  • 苹果11有无线充电功能吗(苹果11无线充电怎么设置)

    苹果11有无线充电功能吗(苹果11无线充电怎么设置)

  • 苹果11有3dtouch功能吗(苹果11有没有3dtouch功能)

    苹果11有3dtouch功能吗(苹果11有没有3dtouch功能)

  • 户户通反复重启升级(户户通反复启动)

    户户通反复重启升级(户户通反复启动)

  • 4+128g和6+128g有什么区别(4+128g和6+128g哪个好)

    4+128g和6+128g有什么区别(4+128g和6+128g哪个好)

  • 碎片整理在哪里(碎片整理已完成0℅)

    碎片整理在哪里(碎片整理已完成0℅)

  • 安卓手机怎么设置动态壁纸(安卓手机怎么设置陌生号码打不进来)

    安卓手机怎么设置动态壁纸(安卓手机怎么设置陌生号码打不进来)

  • 拼多多悬浮球怎么关闭(拼多多悬浮球怎么设置)

    拼多多悬浮球怎么关闭(拼多多悬浮球怎么设置)

  • word2007文字效果在哪(word2007文字效果七彩霓虹怎么设置)

    word2007文字效果在哪(word2007文字效果七彩霓虹怎么设置)

  • 打印凭证怎么设置纸张(打印凭证怎么设置成信封c5)

    打印凭证怎么设置纸张(打印凭证怎么设置成信封c5)

  • wps筛选两列重复数据(wps表格筛选两列重复数据)

    wps筛选两列重复数据(wps表格筛选两列重复数据)

  • 小微企业印花税怎么算
  • 什么叫社会化纳税服务?
  • 跨年度进项税额转出怎么申报
  • 招标押金如何做账务处理?
  • 返岗补贴怎么办理
  • 收到赠送的商品并销售
  • 期间费用的界定
  • 通过公账直接转账可以吗
  • 社会团体收费项目有哪些
  • 税控盘上开完发票发的邮件在哪查看
  • 公司购买新办公楼装修计入什么科目
  • 每股股份价格
  • 工业企业销售管理制度
  • 租车开具的电子发票
  • 用友加密狗可以拔下来么
  • 中小企业费用管理
  • 居民小区人防设施主要是什么
  • 自购自销金银首饰应纳消费税如何处理?
  • 送积分怎么做账
  • linux默认文件类型
  • windows10如何添加英文输入法
  • 固定资产清理会发生什么费用
  • 冲减预交的增值税税率
  • 炫龙dd3笔记本怎么样
  • php拼接url
  • 自产货物用于生产
  • 小规模纳税人的企业所得税怎么算
  • window10自带商店下载位置
  • WordPress导航菜单权限控制
  • 简述税款征收的基本原则
  • 应付职工薪酬是负数是什么意思
  • jquery设置不可用
  • 如何网上添加办税员上海
  • 个税率是多少
  • 税金及附加多计提年报更正
  • phpcms使用教程
  • 向境外股东分配股息预提所得税
  • 增值税增量留抵退税计算
  • 个人所得税申报截止时间
  • 出口货物申报表如何填写
  • 装修工程是可以做什么的
  • 资产负债表怎么看盈利或亏损
  • 资金收益率的计算
  • 什么是销项税额转出
  • 劳务费发票是个人的吗
  • 以前年度应收账款错误如何调整
  • 预收账款挂账多长时间必须确认收入
  • 分期购车会计分录小规模
  • 差旅费包括哪些项目
  • 一般纳税人可以开1%的发票吗
  • 食品企业产品
  • 外资企业贷款条件
  • 个体工商户是否要交税
  • 电费发票没拿到怎么做账
  • 电子发票一定要盖章吗
  • mysql函数用法
  • mysql压测调优
  • sql比较两个集合
  • 优化什么建立生育支持政策体系
  • mac trim功能
  • linux cwd
  • 丢失msvcr80.dll
  • 如何打开音量控制器
  • linux安装fping
  • win7文件夹选项在哪里打开
  • win8如何修改文件权限
  • Win10 Mobile RedStone预览版14283更新内容汇总
  • cocos2dx开发的游戏有哪些
  • jquery实现复选框全选
  • unity 技术
  • fiori开发
  • android事件处理方式有几种
  • js中如何弹出提示框
  • javascript核心技术开发解密
  • 国际货运怎么代理
  • 怎么看上期留抵税额
  • 税控机怎么开发票
  • 天津市东丽区军粮城派出所电话
  • 公司如何制定制度
  • 四川残疾人社保补贴
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设