【力扣经典题目】复制带随机指针的链表,穿插链表法
创始人
2024-05-06 04:56:59
0

题目描述:

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

你的代码  接受原链表的头节点 head 作为传入参数。

示例 1:

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

提示:

  • 0 <= n <= 1000
  • -104 <= Node.val <= 104
  • Node.random 为 null 或指向链表中的节点。

代码格式:

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/struct Node* copyRandomList(struct Node* head) 
{//write code here
}

题解:

所谓穿插链表法,就是在原链表的基础上按需求插入新的节点构成新链表,然后再根据题目要求对新链表进行操作,包括拆分、排序等。

本题就可以利用穿插链表法,先在原链表每个节点后面插入一个新的拷贝节点,即其val和next的值都赋值的与原节点相同,然后通过迭代对每个拷贝节点的随机指针进行赋值,其值为指向原节点随即指针的新节点。最后分别断开为原链表和新链表即可。确实有点绕,不过下面有图,我相信你看一下就明白了。

先构造新链表:

例如对于链表 A→B→C,我们可以将其拆分为 A→A′→B→B′→C→C′
 

 然后通过迭代赋值每个拷贝节点的随机指针。

 

最后断开为原链表和新链表。

 代码如下:

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/struct Node* copyRandomList(struct Node* head) 
{if(head==NULL)return NULL;//创建穿插链表for(struct Node* cur=head;cur;cur=cur->next->next){struct Node* newnode= (struct Node*)malloc(sizeof(struct Node));newnode->val=cur->val;newnode->next=cur->next;cur->next=newnode;}//给拷贝链表的random赋值for(struct Node* cur=head;cur;cur=cur->next->next){if(cur->random!=NULL)cur->next->random=cur->random->next;elsecur->next->random=NULL;}//切断穿插链表为原链表和新链表struct Node* newhead = head->next;for(struct Node* cur=head;cur;cur=cur->next){struct Node* newnode = cur->next;//记录一下,以防丢失cur->next=newnode->next;//先连接原链表newnode->next=newnode->next!=NULL?newnode->next->next:NULL;}return newhead;
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...