解法一:哈希
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead) {
if(!pHead) return NULL;
std::unordered_map<RandomListNode*,RandomListNode*> m;
for(auto p = pHead;p!=NULL;p=p->next){
m[p] = new RandomListNode(p->label);
}
for(auto p = pHead;p!=NULL;p=p->next){
m[p]->next = m[p->next];
m[p]->random = m[p->random];
}
return m[pHead];
}
};
解法二:源链表插入再拆分
步骤一:复制原链表,暂不考虑随机指针
步骤二:复制随机指针
步骤三:拆分原链表与复制链表
class Solution {
public:
void CloneListInPlace(RandomListNode* pHead){
RandomListNode* pCur = pHead;
while(pCur){
RandomListNode* copy = new RandomListNode(pCur->label);
copy->next = pCur->next;
pCur->next = copy;
pCur = copy->next;
}
}
void CloneRandomPtr(RandomListNode* pHead){
RandomListNode* pCur = pHead;
while(pCur){
if(pCur->random){
RandomListNode* copy = pCur->next;
copy->random = pCur->random->next;
}
pCur = pCur->next->next;
}
}
RandomListNode* DepartList(RandomListNode* pHead){
RandomListNode* head = pHead;
RandomListNode* cloneHead = head->next;
RandomListNode* pCur = cloneHead;
while(head){
head->next = pCur->next;
if(!head->next)
pCur->next = NULL;
else
pCur->next = head->next->next;
head = head->next;
pCur = pCur->next;
}
return cloneHead;
}
RandomListNode* Clone(RandomListNode* pHead) {
if(!pHead) return pHead;
// 复制原链表
CloneListInPlace(pHead);
// 复制随机关系
CloneRandomPtr(pHead);
// 分离原始链表与复制链表
return DepartList(pHead);
}
};