难度:中等

    题目描述:
    请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

    示例:
    image.png

    1. 输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
    2. 输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

    解题思路:
    用一个哈希表表示映射关系:键是原节点,值是复制的节点。

    整体算法流程是:

    第一次遍历,复制每个节点和 next 指针,并且保存“原节点-复制节点”的映射关系
    第二次遍历,通过哈希表获得节点对应的复制节点,更新 random 指针

    1. var copyRandomList = function(head) {
    2. if (!head) {
    3. return null;
    4. }
    5. const map = new Map();
    6. let node = head; // 当前节点
    7. const newHead = new Node(node.val);
    8. let newNode = newHead; // 当前节点的copy
    9. map.set(node, newNode);
    10. while (node.next) {
    11. newNode.next = new Node(node.next.val);
    12. node = node.next;
    13. newNode = newNode.next;
    14. map.set(node, newNode);
    15. }
    16. newNode = newHead;
    17. node = head;
    18. while (newNode) {
    19. newNode.random = map.get(node.random);
    20. newNode = newNode.next;
    21. node = node.next;
    22. }
    23. return newHead;
    24. };