1,對(duì)原鏈表每個(gè)節(jié)點(diǎn)進(jìn)行賦值,并插入對(duì)每個(gè)節(jié)點(diǎn)的后面。
2,從頭開(kāi)始對(duì)每個(gè)新加節(jié)點(diǎn)的random位賦值
if(p->random)
p->next->random = p->random->next;
else
p->next->random = NULL;
3,恢復(fù)原鏈表,同時(shí)把新復(fù)制的節(jié)點(diǎn)保證在新鏈表并返回。
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;
}