题目:
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://blog.csdn.net/u012243115/article/details/45562505 。
代码:
/**
* 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)
{
if(head == NULL)
return NULL;
//1、复制一个接在原结点后面
RandomListNode *p = head;
while(p)
{
RandomListNode *copy = new RandomListNode(p->label);//新复制一个结点
RandomListNode *tmp = p->next;//临时保存当前结点的next
p->next = copy;//把新复制的结点接到当前结点后面
copy->next = tmp;
p = tmp;
}
//2、确定复制的结点的random
p = head;
while(p)
{
RandomListNode *copy = p->next;
RandomListNode *tmp = p->next->next;
if(p->random != NULL)
copy->random = p->random->next;//确定新复制结点的random
p = tmp;
}
//3、断开成两个完全相同的链表
p = head;
RandomListNode *newHead = p->next , *p2 = newHead;
while(p2)
{
p->next = p2->next;
if(p2->next == NULL)
break;
p2->next = p2->next->next;
p = p->next;
p2 = p2->next;
}
return newHead;
}
};