1,对原链表每个节点进行赋值,并插入对每个节点的后面。
2,从头开始对每个新加节点的random位赋值
if(p->random)
p->next->random = p->random->next;
else
p->next->random = NULL;
3,恢复原链表,同时把新复制的节点保证在新链表并返回。
while(old){
old->next = old->next->next;
if(new->next)
new->next = new->next->next;
else
new->next = NULL;
old = old->next;
new = new->next;
}
free(dummy);
head = oldhead;
return newhead;
/**
* Definition for singly-linked list with a random pointer.
* struct RandomListNode {
* int label;
* struct RandomListNode *next;
* struct RandomListNode *random;
* };
*/
struct RandomListNode *copyRandomList(struct RandomListNode *head) {
if(head == NULL)
return NULL;
struct RandomListNode *dummy = calloc(1, sizeof(struct RandomListNode));
dummy->next = head;
struct RandomListNode * p = dummy->next;
while(p){
struct RandomListNode *node = calloc(1, sizeof(struct RandomListNode));
node->label = p->label;
node->next = p->next;
p->next = node;
p = p->next->next;
}
p = dummy->next;
while(p){
if(p->random)
p->next->random = p->random->next;
else
p->next->random = NULL;
p = p->next->next;
}
//restor old
struct RandomListNode * old = dummy->next;
struct RandomListNode * oldhead = dummy->next;
struct RandomListNode * new = dummy->next->next;
struct RandomListNode * newhead = dummy->next->next;
while(old){
old->next = old->next->next;
if(new->next)
new->next = new->next->next;
else
new->next = NULL;
old = old->next;
new = new->next;
}
free(dummy);
head = oldhead;
return newhead;
}