题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路
第一步:遍历链表,复制每一个结点,并将复制的结点连接在原结点后面(复制next指针) 第二步:遍历链表,判断结点特殊指针是否为空,如果不为空,则将该结点特殊指针连接的结点的下一个结点(特殊指针所连结点的复制结点)连接到该结点的下一个结点(该结点的复制结点)的后面(复制特殊指针)。 第三步:分离原结点与复制结点,返回复制结点首结点的指针。
代码(c++)
class Solution
{
public
:
RandomListNode
* Clone(RandomListNode
* pHead
)
{
if(pHead
==NULL) return NULL;
RandomListNode
* p
=pHead
;
while(p
!=NULL){
RandomListNode
* temp
=new
RandomListNode(p
->label
);
temp
->next
=p
->next
;
p
->next
=temp
;
p
=temp
->next
;
}
p
=pHead
;
while(p
!=NULL){
if(p
->random
!=NULL){
p
->next
->random
=p
->random
->next
;
}
p
=p
->next
->next
;
}
RandomListNode
* Head
=pHead
->next
;
p
=pHead
;
RandomListNode
* q
=Head
;
while(q
!=NULL){
p
->next
=q
->next
;
p
=p
->next
;
if(p
==NULL) break;
q
->next
=p
->next
;
q
=q
->next
;
}
return Head
;
}
};