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

 

示例 1:

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

示例 2:

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

示例 4:

输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。

 

提示:

  • -10000 <= Node.val <= 10000
  • Node.random 为空(null)或指向链表中的节点。
  • 节点数目不超过 1000 。

 

注意:本题与主站 138 题相同:https://leetcode-cn.com/problems/copy-list-with-random-pointer/

 

Related Topics
  • 哈希表
  • 链表

  • 👍 451
  • 👎 0
  • 【哈希表】java,配合一次遍历

    有点绕,和官方题解类似。

    • 构建新链表,和一个旧到新节点的映射关系的nodeMap,key为旧节点,value为对应的新节点。
    • 当我们在遍历旧链表的同时,构建新链表
    • 果旧链表的nextrandom指向的旧节点和新节点的关系在nodeMap不存在,则构建一个新节点,并把对应的nextrandom指向到对应的新节点
    • 如果映射关系在nodeMap中存在,则直接指向对应的新节点
    • 再把新旧链表的遍历指针往后移动一位

    代码

    class Solution {
        public Node copyRandomList(Node head) {
            if (head==null){
                return null;
            }
            Node newHead = new Node(head.val);
            //key为旧的,value为新的
            HashMap<Node, Node> nodeMap = new HashMap<>();
            nodeMap.put(head,newHead);
            Node newCur = newHead;
            Node cur = head;
            while (cur!=null){
                if (!nodeMap.containsKey(cur.next)){
                    nodeMap.put(cur.next, cur.next==null ? null : new Node(cur.next.val));
                }
                if (!nodeMap.containsKey(cur.random)){
                    nodeMap.put(cur.random, cur.random==null ? null : new Node(cur.random.val));
                }
    
                newCur.next = nodeMap.get(cur.next);
                newCur.random = nodeMap.get(cur.random);
                cur = cur.next;
                newCur = newCur.next;
            }
    
    
            return newHead;
        }
    }