1.暴力
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead) {
if(pHead==nullptr) return nullptr;
RandomListNode* t = pHead;
RandomListNode* result_head = new RandomListNode(0); //带头节点的
RandomListNode* t1 = result_head;
//复制链表
while(t!=nullptr)
{
t1->next = new RandomListNode(t->label);
t=t->next;
t1 = t1->next;
}
//
RandomListNode *result = result_head->next; //去掉头节点
//复制next完毕
t = pHead;
t1= result;
while(t!=nullptr)
{
if(t->random==nullptr)
t1 == nullptr;
else
//查找随机指针指向节点的终点位置,
{
RandomListNode* t2 = result;
while(t2!=nullptr)
{
if(t2->label == t->random->label)
{
t1->random = t2;
break;
}
t2=t2->next;
}
}
t=t->next;
t1=t1->next;
}
return result;
}
};
2.hash表
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead) {
if(pHead==nullptr) return nullptr;
unordered_map<RandomListNode*, RandomListNode*> map;
RandomListNode * t = pHead;
while(t!=nullptr)
{
map[t] = new RandomListNode(t->label);先把所有的节点按照next指针指向的顺序填进表中
t=t->next;
}
t = pHead;
while(t!=nullptr)
{
map[t]->next = map[t->next];//当前t节点的next指针指向t->next 节点,下面同理
map[t]->random = map[t->random];
t=t->next;
}
return map[pHead];
}
};