一、题目
二、思路
方法:哈希表
利用哈希表的查询特点,考虑构建 原链表节点
和 新链表节点
的键值对映射关系,再遍历构建新链表各节点的 next 和 random 引用指向即可。
算法流程:
- 1.若头节点 head 为空节点,直接返回 nullnull ;
- 2.初始化: 哈希表 dic , 节点 cur 指向头节点;
- 3.复制链表:
建立新节点,并向 dic 添加键值对 (原 cur 节点, 新 cur 节点) ;
cur 遍历至原链表下一节点(按next节点遍历); - 4.构建新链表的引用指向:
构建新节点的next
和random
引用指向;
cur 遍历至原链表下一节点;
返回值: 新链表的头节点 dic[cur] ;
三、代码
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
//建立旧节点对应新节点的哈希表
unordered_map<RandomListNode*,RandomListNode*>dic;
RandomListNode* Clone(RandomListNode* pHead) {
if(pHead==nullptr)
{
return nullptr;
}
//建立头结点
RandomListNode *cur=pHead;
//建立新旧节点的哈希对应关系
while(cur)
{
dic[cur]=new RandomListNode(cur->label);
cur=cur->next;
}
//建立链接关系
cur=pHead;
while(cur)
{
dic[cur]->next=dic[cur->next];
dic[cur]->random=dic[cur->random];
cur=cur->next;
}
return dic[pHead];
}
};