前言
本周比较忙,简单分享一道力扣题目。作者水平有限,如有任何问题,欢迎在文章下方留言交流!
题目
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
复杂链表例子如下图:
力扣原题地址:
https://leetcode-cn.com/problems/copy-list-with-random-pointer/
思路
可以将原链表的结点和新链表的结点对应起来,存入一个map中,然后再根据原链表的结点对应关系把新链表的连接起来即可。
具体算法流程:
1、如果所给链表头结点为空,则直接返回空值。
2、从头遍历原链表,逐个复制原结点,并将原结点和新结点对应起来存入map中。
(至此原链表除去radom部分复制完成)
3、再次从头遍历原链表,根据原链表结点中radom指向的结点,从map中取出对应的新结点,并进行连接。
返回新链表头结点。
代码实现
这里我用C++具体实现一下:
class Solution {
public:
Node* copyRandomList(Node* head) {
// 若所给链表头结点为空,则直接返回空值
if(head == NULL) return NULL;
// 定义map
unordered_map<Node*, Node*> dir_map;
// 取原链表头结点
Node* cur = head;
// 创建新链表
Node* dum = new Node(0);
Node* pre = dum;
// 从头遍历原链表,逐个复制原结点,并将原结点和新结点对应起来存入map中
while(cur != NULL)
{
// 复制原链表的结点
pre->next = new Node(cur->val);
// 将原链表结点和新链表结点对应起来存入哈希表中
dir_map.insert({cur, pre->next});
pre = pre->next;
cur = cur->next;
}
cur = head;
pre = dum->next;
// 再次从头遍历原链表,根据原链表结点中radom指向的结点,从map中取出对应的新结点,并进行连接
while(cur != NULL)
{
if(cur->random != NULL)
{
pre->random = dir_map[cur->random];
}else
{
pre->random = NULL;
}
pre = pre->next;
cur = cur->next;
}
// 返回新链表头结点
return dum->next;
}
};