题目如下
思路分析与代码
你别说,其实这题算难得
原始思路如下:
-
把复制的结点链接在原始链表的每一对应结点后面
-
把复制的结点的random指针指向被复制结点的random指针的下一个结点
-
拆分成两个链表,奇数位置为原链表,偶数位置为复制链表,注意复制链表的最后一个结点的next指针不能跟原链表指向同一个空结点None,next指针要重新赋值None(判定程序会认定你没有完成复制)
博主研究了一下,不太好弄。
代码也比较长,避免夜长梦多,迟则生变
我们使用map来简化代码
用了map之后,代码的思路也更加清晰,方便默写。。。
第一遍把label和next值拷贝过来
第二遍random要连接自己,这个位置用第一遍的map来寻找
可以直接找到完成了label和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)
{
if(pHead==NULL) return NULL;
map<RandomListNode*,RandomListNode*> m;
RandomListNode* pHead1 = pHead;
RandomListNode* pHead2 = new RandomListNode(pHead1->label);
RandomListNode* newHead = pHead2;
m[pHead1] = pHead2;
while(pHead1){
if(pHead1->next) pHead2->next = new RandomListNode(pHead1->next->label);
else pHead2->next = NULL;
pHead1 = pHead1->next;
pHead2 = pHead2->next;
m[pHead1] = pHead2;
}
pHead1 = pHead;
pHead2 = newHead;
while(pHead1){
pHead2->random = m[pHead1->random];
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
return newHead;
}
};