【leetcode100-032】【链表/回溯/哈希】随机链表的复制

2024-01-07 20:09:14

【题干】

给你一个长度为?n?的链表,每个节点包含一个额外增加的随机指针?random?,该指针可以指向链表中的任何节点或空节点。

构造这个链表的?深拷贝。?深拷贝应该正好由?n?个?全新?节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的?next?指针和?random?指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点?

例如,如果原链表中有?X?和?Y?两个节点,其中?X.random --> Y?。那么在复制链表中对应的两个节点?x?和?y?,同样有?x.random --> y?。

返回复制链表的头节点。

用一个由?n?个节点组成的链表来表示输入/输出中的链表。每个节点用一个?[val, random_index]?表示:

  • val:一个表示?Node.val?的整数。
  • random_index:随机指针指向的节点索引(范围从?0?到?n-1);如果不指向任何节点,则为??null?。

你的代码??接受原链表的头节点?head?作为传入参数。

【思路】

  • 对任意未创建的节点,我们先创建它的拷贝;
  • 然后我们对它的后继节点和随机指针指向的节点进行检查,若不存在则也创建拷贝,同时递归的回到第一步,直到某节点的后继指针和随机指针都指向了已创建节点,并从表中取出了它们的指针,完成了自己两个变量的赋值后才退出当前层次;
  • 如何避免重复创建呢?我们用哈希表记录每一个节点的拷贝节点的创建情况,当它被创建时,记录其指针,而当有节点的后继是它时,我们可以方便快速的从表中取出其指针;
  • 如此循环直到链表走到末尾,就可以确保所有链上节点都已经完成自身、next指针、随机指针三者的拷贝啦!

【题解】

class Solution {
public:
    unordered_map<Node*, Node*> cachedNode;

    Node* copyRandomList(Node* head) {
        if (head == nullptr) {
            return nullptr;
        }
        if (!cachedNode.count(head)) {
            Node* headNew = new Node(head->val);
            cachedNode[head] = headNew;
            headNew->next = copyRandomList(head->next);
            headNew->random = copyRandomList(head->random);
        }
        return cachedNode[head];
    }
};

文章来源:https://blog.csdn.net/weixin_63059689/article/details/135433149
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。