解题思路
算法流程:
- 建立映射
对新链表结点和原链表结点建立
hashmap
的映射关系,原链表结点为key
,新链表结点为value
- 赋值
通过
hashmap
将原链表的next
,random
所指结点赋给新链表,注意赋值时,要判断该两值是否不为空,因为建立hashmap
时,没有建立null
,null
的映射
- 返回新链表头结点
hashmap[head]
代码
class Solution {
public:
Node* copyRandomList(Node* head) {
if (head == nullptr) return nullptr;
std::unordered_map<Node*, Node*> listMap;
Node* p = head;
//将原链表和新链表建立映射关系
while (p != nullptr) {
listMap[p] = new Node(p->val);
p = p->next;
}
p = head;
//将原链表的next,random值赋给新链表
while (p != nullptr) {
if(p->next) listMap[p]->next = listMap[p->next];//如果p->next不为空
if(p->random) listMap[p]->random = listMap[p->random];//如果p->random不为空
p = p->next;
}
return listMap[head];
}
};