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;
* struct RandomListNode *next;
* struct RandomListNode *random;
* };
*/
struct RandomListNode *copyRandomList(struct RandomListNode *head) {
struct RandomListNode *oldNode = head;
struct RandomListNode *newNode = NULL;
struct RandomListNode *newHead = NULL;
if(head == NULL){
return NULL;
}
/*insert a new randomList Node*/
while(oldNode){
newNode = (struct Random *)malloc(sizeof(struct RandomListNode));
if(NULL == newNode){
return NULL;
}
newNode->label = oldNode->label;
newNode->next = oldNode->next;
newNode->random = oldNode->random;
oldNode->next = newNode;
oldNode = newNode->next;
}
/*link the new List Node*/
oldNode = head;
while(oldNode){
if(oldNode->random != NULL){
oldNode->next->random = oldNode->random->next;
}
if(oldNode->next!=NULL){
oldNode = oldNode->next->next;
}
}
/*link the new List Node from the old List*/
oldNode = head;
newHead = head->next;
while(oldNode){
newNode = oldNode->next;
oldNode->next = newNode->next;
oldNode = oldNode->next;
if(oldNode != NULL){
newNode->next = oldNode->next;
}
}
return newHead;
}