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.
思路:首先不考虑random进行复制,新建一个链表;然后利用建立旧链表节点和新链表对应节点之间的映射表map来进行增加random。
/**
* Definition for singly-linked list with a random pointer.
* struct RandomListNode {
* int label;
* RandomListNode *next, *random;
* RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
* };
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
RandomListNode *head2,*tail2;
map<RandomListNode*,RandomListNode*> hashMap;
//复制新链表,但是不含random
for(RandomListNode *cur=head; cur!=NULL; cur=cur->next)
{
RandomListNode *node=new RandomListNode(cur->label);
hashMap[cur]=node;//建立旧链表节点和新链表对应节点之间的映射表
if(cur==head)
{
head2=node;
tail2=head2;
}
else
{
tail2->next=node;
tail2=node;
}
}
//新链表添加random
for(RandomListNode *cur2=head2,*cur=head; cur2!=NULL&&cur!=NULL; cur2=cur2->next,cur=cur->next)
{
if(cur->random!=nullptr)
{
cur2->random=hashMap[cur->random];
}
}
return head2;
}
};