比起标准的链表深拷贝,还需要了解一个random pointer的信息。需要建立起新的链表单元和旧的链表单元之间的一一对应关系,然后将所有旧的random pointer更换为新的random pointer。这样就要求两次扫描,O(2n)。
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
RandomListNode *chead=new RandomListNode(0);
map<RandomListNode *,RandomListNode *> relations;
RandomListNode *ptr=head;
RandomListNode *last=chead;
while(ptr!=nullptr){
RandomListNode *node=new RandomListNode(ptr->label);
node->random=ptr->random;
last->next=node;
relations[ptr]=node;
last=last->next;
ptr=ptr->next;
}
ptr=chead->next;
while(ptr!=nullptr){
ptr->random=relations[ptr->random];
ptr=ptr->next;
}
ptr=chead;
chead=chead->next;
delete ptr;
return chead;
}
};