Copy List with Random Pointer

本文介绍一种深拷贝包含随机指针的复杂链表的方法,分为三步骤:首先,在每个节点后插入复制节点;其次,复制随机指针;最后,将链表拆分成原链表和新链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

这是照着这个思路写的http://www.2cto.com/kf/201401/276086.html,很详细,主要分三步:

第一步:在原始链表上每一个节点后面插入一个跟此节点相同的节点;

第二步:依次复制随机指针;

第三步:将生成的链表拆成两部分。


代码如下:

class Solution {
public:
    RandomListNode *copyRandomList(RandomListNode *head) {
if(head == NULL)
return NULL;
copyNext(head);
copyRandomPtr(head);
return divList(head);
    }
void copyNext(RandomListNode *head)
{
RandomListNode *tHead = head;
RandomListNode *next = NULL;
while (tHead)
{
next = tHead->next;   //这是原始链表的下一个节点
RandomListNode *tmpNode = new RandomListNode(tHead->label);  //创建一个新的此节点
tmpNode->next = tHead->next;  //此节点的下一个节点也是原始链表的下一个节点
tHead->next = tmpNode;        //将此节点链接到原始链表的节点中
tHead=next;      //头指向原始链表的下一个节点
}
}
void copyRandomPtr(RandomListNode *head)  //复制随机指针
{
RandomListNode *tHead = head;
while (tHead)
{
if (tHead->random)
tHead->next->random = tHead->random->next;
tHead = tHead->next->next;
}
}
RandomListNode * divList(RandomListNode *head)  //分离链表
{
RandomListNode *tHead = head;
RandomListNode *retList=NULL;
RandomListNode *tRet;
RandomListNode *next;
while (tHead)
{
if (retList==NULL)   //如果返回的链表为空,那么就设置链表头
{
next = tHead->next->next;  //赋值原始链表的下一个节点
retList = tHead->next;     //设置返回的链表头
tRet = retList;            //用这个临时链表去操作
tHead->next=next;          //链接原始链表的下一个
tHead=next;                //指向原始链表的下一个
}
else
{
next = tHead->next->next;
tRet->next=tHead->next; //返回链表的下一个就是原始链表的下一个,因为这时候返回链表的指向在原始链表的前面
tHead->next=next;
tHead=next;
tRet = tRet->next;
}
}
return retList;
}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值