复杂链表的复制
一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
方法一:用unordered_map,key为原链表的每一个节点,value为对应节点的复制,
步骤:
1.遍历链表,对于每一个节点,复制一个一样的(只管值相同,先不管指针域)用RandomListNode* temp=new RandomListNode(p->label);进行复制
2.再次遍历链表,对于每一个节点的next和random都可以去找map里的节点给我的节点加上去:m[p]->next=m[p->next]
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
unordered_map<RandomListNode*,RandomListNode*> m;
RandomListNode* p=pHead;
while(p!=NULL)
{
RandomListNode* temp=new RandomListNode(p->label);//RandomListNode* temp=NULL;
m.insert(make_pair(p,temp)); //temp->label=p->label;一开始用这两行,本机可以,但是牛客报错
p=p->next;
}
p=pHead;
while(p!=NULL)
{
m[p]->next=m[p->next];
m[p]->random=m[p->random];
p=p->next;
}
return m[pHead];
}
};方法2:把每个节点复制,复制后的点挂在节点后面:1->1'->2->2'->3->3',然后再进行分离
代码比较复杂,尝试过,本机可以但是牛客报错了


