本题思路:

要我们对一个链表进行深拷贝,但是该链表比较特殊,除了节点的后继节点外,还存在随机节点。因为随即指针 random 的存在,我们在拷贝节点时,【当前节点的随机指针指向的节点】不允许指向原来链表的节点,必须指向新链表的节点,那么就会面临一个问题:【当前节点的随机指针指向的节点】还未创建。因此,考虑可以提前存储原链表的与新链表之间节点的对应关系就可以解决问题了。

首次遍历原链表时,使用哈希表将原链表和它的副本链表创建对应关系。这样一来,我们在第二次遍历原链表时,可以通过 map 的对应关系创建新的链表以及【当前节点的后继节点】和【当前节点的随机指针指向的节点】。

具体可实现代码如下:

/*
// Definition for a Node.
class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/

class Solution {
    public Node copyRandomList(Node head) {
       
        Map<Node, Node> map = new HashMap<>();

        Node curr = head;
        while(curr != null){
            //原链表+原链表副本 的对应关系
            map.put(curr, new Node(curr.val));
            curr = curr.next;
        }

        curr = head;
        while(curr != null){
            //根据对应关系创建新的链表
            Node newNode = map.get(curr);
            newNode.next = map.get(curr.next);
            newNode.random = map.get(curr.random);
            curr = curr.next;
        }
        return map.get(head);

    }
}

时间复杂度为 O(n),空间复杂度为 O(n)。

Categories:

Tags:

No responses yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注