/**
* 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:
using UMP = unordered_map<RandomListNode*, RandomListNode*>;
RandomListNode *copyRandomList(RandomListNode *head) {
if (head == nullptr) return nullptr;
RandomListNode* ret = new RandomListNode(head->label);
UMP mp{{head, ret}};
RandomListNode* pdest = solver(head, ret, mp);
RandomListNode* psrc = head->next;
while (psrc) {
pdest = solver(psrc, pdest, mp);
psrc = psrc->next;
}
return ret;
}
private:
RandomListNode* solver(RandomListNode*& psrc, RandomListNode*& pdst, UMP& mp) {
if (psrc->random == nullptr) pdst->random == nullptr;
else {
UMP::iterator it = mp.find(psrc->random);
if(it == end(mp)) {
RandomListNode* p = new RandomListNode(psrc->random->label);
mp[psrc->random] = p;
pdst->random = p;
} else {
pdst->random = it->second;
}
}
if (psrc->next == nullptr) pdst->next == nullptr;
else {
UMP::iterator it = mp.find(psrc->next);
if(it == end(mp)) {
RandomListNode* p = new RandomListNode(psrc->next->label);
mp[psrc->next] = p;
pdst->next = p;
} else {
pdst->next = it->second;
}
}
return pdst ->next;
}
};
参考后
/**
* 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) {
// insert a copy behind
if (head == nullptr) return nullptr;
RandomListNode* ret;
RandomListNode* pSrc = head;
RandomListNode* tmp = nullptr;
// tmp = srcNext;
while (pSrc) {
RandomListNode* copy = new RandomListNode(pSrc->label);
copy->next = pSrc->next;
pSrc->next = copy;
pSrc = copy->next;
}
pSrc = head;
// tmp = pSrc->random
while (pSrc) {
if (pSrc->random != nullptr)
pSrc->next->random = pSrc->random->next;
pSrc = pSrc->next->next;
}
ret = head->next;
pSrc = ret->next;
head->next = pSrc;
// tmp = pDst;
tmp = ret;
while (pSrc) {
tmp->next = pSrc->next;
tmp = tmp->next;
pSrc->next = tmp->next;
pSrc= pSrc->next;
}
return ret;
}
};