题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
本题知识点:
链表
解题思路:
使用一个哈希表对链表进行复制,先逐个结点遍历原始链表,将原始链表结点作为key,新建链表结点作为value,先对value的label进行赋值,再依次便利,将原始结点的next和random依次赋给value中的结点。
代码:
/*
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)
return pHead;
RandomListNode* p1 = pHead;
RandomListNode* p2 = pHead;
unordered_map<RandomListNode*, RandomListNode*> map;
// 复制原始结点的label
while(p1)
{
map.insert({p1, new RandomListNode(p1->label)});
p1 = p1->next;
}
while(p2)
{
// 复制原始结点的next
if(p2->next)
{
map[p2]->next = map[p2->next];
}
else
{
map[p2]->next = NULL;
}
// 复制原始结点的random
map[p2]->random = map[p2->random];
p2 = p2->next;
}
return map[pHead];
}
};