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.
/**
* Definition for singly-linked list with a random pointer.
* struct RandomListNode {
* int label;
* RandomListNode *next, *random;
* RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
* };
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
RandomListNode *pHead=head;
if(pHead==NULL)
{
return NULL;
}
if(pHead->next==NULL)
{
RandomListNode *pHead_copy=new RandomListNode(pHead->label);
pHead_copy->next=NULL;
if(pHead->random!=NULL)
{
pHead_copy->random=pHead_copy;
}
return pHead_copy;
}
//第一步 在每个结点的后面插入一个copy
for(RandomListNode *pNode=pHead;pNode!=NULL;pNode=pNode->next->next)
{
RandomListNode *pNodeCopy=new RandomListNode(0);
pNodeCopy->label=pNode->label;
pNodeCopy->next=pNode->next;
pNodeCopy->random=NULL;
pNode->next=pNodeCopy;
}
//第二步 '遍历'扩充后的链表,设置copy结点的pOther
for(RandomListNode *pNode=pHead;pNode!=NULL;pNode=pNode->next->next)
{
if(pNode->random)
pNode->next->random=pNode->random->next;
else
pNode->next->random=NULL;
}
//第三步 拆分链表
RandomListNode *pHead_copy=pHead->next;
for(RandomListNode *pNode=pHead;pNode!=NULL;)
{
RandomListNode *pTmp=pNode->next;
if(pTmp)
{
pNode->next=pNode->next->next;
}
pNode=pTmp;
}
return pHead_copy;
}
};