美文网首页
复杂链表的复制

复杂链表的复制

作者: 曾大稳丶 | 来源:发表于2022-04-13 11:19 被阅读0次

题目链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/

image.png

思路解题
本题实需要现一个复杂链表的深拷贝,因为涉及到随机性,nextrandom节点可能会没有被创建,所以本题的难点是怎么在创建之后在设置nextrandom节点。

思路一:
采用HashMap进行缓存Node,如果HashMap对应没有找到这个Node,就进行创建和缓存,缓存之后在赋值nextrandom节点。
代码如下

    class Node {
        int val;
        Node next;
        Node random;

        public Node(int val) {
            this.val = val;
            this.next = null;
            this.random = null;
        }
    }
    HashMap<Node,Node> nodeNodeCache = new HashMap<>();
    public Node copyRandomList(Node head) {
        if (head==null){
            return null;
        }
        if (!nodeNodeCache.containsKey(head)){
            Node node = new Node(head.val);
            nodeNodeCache.put(head,node);
            node.next = copyRandomList(head.next);
            node.random = copyRandomList(head.random);
        }
        return nodeNodeCache.get(head);
    }

复杂度分析
时间复杂度:O(n)。
空间复杂度:O(n)。

思路二:
在思路一的基础上主要是针对空间复杂度的优化,采用A→B→C ---> A→A'→B→B'→C→C' 在进行randomnext的赋值。如下图所示:

原始node.png
复制node.png
random指向.png
next指向.png

代码如下

public Node copyRandomList(Node head) {
        if (head == null) {
            return null;
        }
        // 复制node
        for (Node node = head; node != null; node = node.next.next) {
            Node nodeNew = new Node(node.val);
            nodeNew.next = node.next;
            node.next = nodeNew;
        }
       // random指向
        for (Node node = head; node != null; node = node.next.next) {
            Node nodeNew = node.next;
            nodeNew.random = (node.random != null) ? node.random.next : null;
        }
        Node headNew = head.next;
       //next指向
        for (Node node = head; node != null; node = node.next) {
            Node nodeNew = node.next;
            node.next = node.next.next;
            nodeNew.next = (nodeNew.next != null) ? nodeNew.next.next : null;
        }
        return headNew;
    }

复杂度分析
时间复杂度:O(n)。
空间复杂度:O(1)。

相关文章

  • 面试题35. 复杂链表的复制

    复杂链表的复制 题目描述 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了...

  • LeetCode:复制带随机指针的链表

    面试题35. 复杂链表的复制 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点...

  • 复杂链表的复制

    时间复杂度为O(n),需要额外空间O(n) 时间复杂度O(n),无额外空间

  • 复杂链表的复制

    题目描述:有一个复杂链表,其结点除了有一个Next指针指向下一个结点外,还有一个random指向链表中的任意结点或...

  • 复杂链表的复制

    题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),...

  • 复杂链表的复制

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)...

  • 复杂链表的复制

    题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点...

  • 复杂链表的复制

    复杂链表的复制 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个...

  • 复杂链表的复制

    输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。返回一个...

  • 复杂链表的复制

网友评论

      本文标题:复杂链表的复制

      本文链接:https://www.haomeiwen.com/subject/xczosrtx.html