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.
Analysis:
1. insert new node
2. copy random node
3. decouple the list
like the picture shows:
java
public RandomListNode copyRandomList(RandomListNode head) {
RandomListNode cur = head;
while(cur!=null){//insert node
RandomListNode temp = new RandomListNode(cur.label);
temp.next = cur.next;
cur.next = temp;
cur = temp.next;
}
cur = head;
while(cur!=null){//copy random pointer
RandomListNode temp = cur.next;
if(cur.random!=null){
temp.random = cur.random.next;//insert random pointer
}
cur = temp.next;
}
cur = head;
RandomListNode result = (head==null ? null:head.next);
while(cur!=null){//decouple the list
RandomListNode temp = cur.next;
cur.next = temp.next;
if(temp.next!=null)
temp.next = temp.next.next;
cur = cur.next;
}
return result;
}
注意为空的情况
c++
RandomListNode *copyRandomList(RandomListNode *head) {
RandomListNode *cur = head;
//insert node
while(cur != NULL){
RandomListNode *temp = new RandomListNode(cur->label);
temp->next = cur->next;
cur->next = temp;
cur = temp->next;
}
cur = head;
//copy random pointer
while(cur != NULL){
RandomListNode *temp = cur->next;
if(cur->random != NULL)
temp->random = cur->random->next;
cur = temp->next;
}
//decoupe list
cur=head;
RandomListNode *du = head == NULL ? NULL:head->next;
while(cur != NULL){
RandomListNode *temp = cur->next;
cur->next = temp->next;
if(temp->next!=NULL)
temp->next = cur->next->next;
cur = cur->next;
}
return du;
}