大前端

前端学习之家-大前端

剑指Offer35.复杂链表的复制

题目

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

示例 1:

img

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

img

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]
示例 3:

img

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

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

提示:

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

思路

难点在于结点中的random指针,初始化链表时,当前链表结点的random指向的结点可能还没生成。

所以我们这里可以先遍历链表一次,用map先存放原结点的地址和拷贝出的结点(只包含val),第二次遍历时再将拷贝结点的next和random指针连到对应结点

代码

public Node copyRandomList(Node head) {
        if (head == null) {
            return head;
        }
        //map中存的是(原节点,拷贝节点)的一个映射
        Map<Node, Node> map = new HashMap<>();
        for (Node cur = head; cur != null; cur = cur.next) {
            map.put(cur, new Node(cur.val));
        }
        //再遍历链表,将只存有值的拷贝结点的next和random指针连到对应结点
        for (Node cur = head; cur != null; cur = cur.next) {
            map.get(cur).next = map.get(cur.next);
            map.get(cur).random = map.get(cur.random);
        }

        return map.get(head);
    }

发表评论:

Copyright Your WebSite.Some Rights Reserved.