随机链表的复制

news/2024/10/20 21:28:51/

后插节点解答

        实现目标,要将复杂问题拆解为较为解决的较小问题进行逐步解决。可以将要复制的链表分为节点插入到每个原链表的节点后面,如图所示:

1.插入复制节点       

        想要实现如图所示效果,首先用malloc创建节点,然后后插入每个原节点的后面,这里要注意的是,应该先改变插入节点的next指针,防止因为覆盖导致原指针的next指针无法被找到。代码如下:

struct Node* cur = head;while(cur){//创建节点struct Node* copy = (struct Node*)malloc(sizeof(struct Node));copy->val = cur->val;copy->next = cur->next;cur->next = copy;cur = copy->next;//通过赋值让cur继续往后走}

结束条件以cur为主体确定:cur走到空停止。

2.控制random

        通过后插节点解答的优越性就体现出来了,将难以寻找的random节点通过后插copy节点实现新的copy节点的random指针在原节点的random指针的下一个位置。代码实现如下:

cur = head;while(cur){struct Node* copy = cur->next;;if(cur->random == NULL){copy->random = NULL;}else{copy->random = cur->random->next;//此解法的优势所在}cur = copy->next;//cur往后走   }

3.将效果实现好的copy从原链表中拆解为独立的新链表(恢复原链表

        在这里我们为了防止覆盖要多创建一个next指针存放节点位置,并定义头节点与尾指针来进行尾插的实现。循环的主体仍是cur。代码实现如下:

cur = head;struct Node* copytail = NULL, *copyhead = NULL;while(cur){struct Node* copy = cur->next;struct Node* next = copy->next;  if(copytail == NULL){copyhead = copytail = copy;}else{copytail->next = copy;copytail = copytail->next;}cur->next = next;//恢复原链表cur = next;}return copyhead;

        像这样,通过化繁为简的方法将复杂的问题分为三块较为简单的函数,就可以解决问题了。

最后,我们将代码整合起来,即为:

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/struct Node* copyRandomList(struct Node* head) 
{struct Node* cur = head;while(cur){//创建节点struct Node* copy = (struct Node*)malloc(sizeof(struct Node));copy->val = cur->val;copy->next = cur->next;cur->next = copy;cur = copy->next;//copy往后走}//控制randomcur = head;while(cur){struct Node* copy = cur->next;;if(cur->random == NULL){copy->random = NULL;}else{copy->random = cur->random->next;//此解法的优势所在}cur = copy->next;//cur往后走   }//将copy节点尾插到新链表中cur = head;struct Node* copytail = NULL, *copyhead = NULL;while(cur){struct Node* copy = cur->next;struct Node* next = copy->next;  if(copytail == NULL){copyhead = copytail = copy;}else{copytail->next = copy;copytail = copytail->next;}cur->next = next;//恢复原链表cur = next;}return copyhead;
}


http://www.ppmy.cn/news/1464909.html

相关文章

Textual for Mac:轻量级IRC客户端

在寻找一款高效、轻量级的IRC客户端时,Textual for Mac无疑是你的不二之选。它集成了众多现代技术,如本机IPv6、最新的IRCv3规范,以及客户端证书身份验证,让你的聊天体验更加顺畅和安全。 Textual for Mac v7.2.2免激活版下载 Tex…

python生成词云图

生成词云图的话需要先对数据进行分词处理 , 分词方法点击查看 import pandas as pd from collections import Counter from wordcloud import WordCloud import matplotlib.pyplot as plt# 假设您已经按照之前的步骤处理了数据,并且处理后的数据保存在comments_proc…

linux 常用命令:find grep ps netstat sudo df du rm

rm 命令 删除 -r 是递归参数(recursive),用于删除目录及其内容。如果不加这个参数,rm 命令无法删除非空目录。-f 是强制参数(force),用于强制删除文件或目录,不会进行任何确认提示…

【iOS】——工厂设计模式

文章目录 一、设计模式创建型模式结构型模式行为型模式 二、设计模式七大准则三、简单工厂模式四、工厂方法模式五、抽象工厂模式 一、设计模式 设计模式是指在特定上下文中解决常见问题时所采用的一套可复用的解决方案。这些模式是面向对象编程中的通用概念,广泛应…

vue3中el-form表单校验,再点击提交按钮的时候通过校验才进行提交

vue3中el-form表单校验&#xff0c;再点击提交按钮的时候通过校验才进行提交 一、前言1、案例 一、前言 在 Vue 3 中&#xff0c;可以使用 Element UI 的 <el-form> 组件配合 <el-form-item> 来实现表单的必填项校验&#xff0c;并在提交时根据校验结果来决定是否…

去除字符串中的空格和特殊字符

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 用户在输入数据时&#xff0c;可能会无意中输入多余的空格&#xff0c;或在一些情况下&#xff0c;字符串前后不允许出现空格和特殊字符&#xff0c;…

数据库漫谈-MySQL

MySQL的发展大体上分为4个阶段&#xff1a; 1979-2000 业余开发阶段 2000年&#xff0c;MySQL AB公司在瑞典成立 2008年1月&#xff0c;MySQL AB公司被Sun公司以10亿美金收购。 2009年4月&#xff0c;Oracle公司以74亿美元收购Sun公司 免费好用是MySQL的最…

玄机应急响应-Linux日志分析

1、有多少IP在爆破主机ssh的root帐号&#xff0c;如果有多个使用","分割 rootip-10-0-10-4:/var/log# cat auth.log.1 | grep -a "Failed password for root" | awk {print($11)} | uniq | sort 192.168.200.2 192.168.200.31 192.168.200.32 这段命令是…