题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
代码:
class Solution {
public:
RandomListNode* Clone(RandomListNode* head1)
{
if(head1==NULL)return NULL;
RandomListNode *cur1=head1,*head2=NULL,*cur2;
while(cur1){//每个结点的复制结点插入到当前结点之后
RandomListNode *temp=new RandomListNode(cur1->label);
temp->next=cur1->next;
cur1->next=temp;
cur1=temp->next;
}
cur1=head1;
while(cur1){//给每个复制结点的random赋值。
if(cur1->random)
cur1->next->random=cur1->random->next;
cur1=cur1->next->next;
}
cur1=head1;
head2=cur2=head1->next;//head2指向复制结点的头部
while(cur2->next!=NULL){//将复制的结点分离出来
cur1=cur1->next=cur2->next;
cur2=cur2->next=cur1->next;
}
cur1->next=NULL;//分离出复制结点后,原始链表的最后一个结点还指向它的赋值结点,所以要重新赋值为空
return head2;
}
};