zoukankan      html  css  js  c++  java
  • 复杂链表的复制

    题解1: 哈希表

    空间和时间都是O(n)

    class Solution {
        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));
            }
            //将拷贝的新的节点组织成一个链表
            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);
        }
    }
    

    题解2: 原地修改

    空间O(1)

    class Solution {
        public Node copyRandomList(Node head) {
            if (head == null) {
                return head;
            }
            //将拷贝节点放到原节点后面,例如1->2->3这样的链表就变成了这样1->1'->2'->3->3'
            for (Node node = head, copy = null; node != null; node = node.next.next) {
                copy = new Node(node.val);
                copy.next = node.next;
                node.next = copy;
            }
            //把拷贝节点的random指针安排上
            for (Node node = head; node != null; node = node.next.next) {
                if (node.random != null) {
                    node.next.random = node.random.next;
                }
            }
            //分离拷贝节点和原节点,变成1->2->3和1'->2'->3'两个链表,后者就是答案
            Node newHead = head.next;
            for (Node node = head, temp = null; node != null && node.next != null;) {
                temp = node.next;
                node.next = temp.next;
                node = temp;
            }
    
            return newHead;
        }
    }
    
    

    题解3: DFS

    图的基本单元是 顶点,顶点之间的关联关系称为 边,我们可以将此链表看成一个图

    class Solution:
        def copyRandomList(self, head: 'Node') -> 'Node':
            def dfs(head):
                if not head: return None
                if head in visited:
                    return visited[head]
                # 创建新结点
                copy = Node(head.val, None, None)
                visited[head] = copy
                copy.next = dfs(head.next)
                copy.random = dfs(head.random)
                return copy
            visited = {}
            return dfs(head)
    
  • 相关阅读:
    【tips】Clion添加Qt gui绘制快捷方式
    conda配置安装pytorch tensorflow-gpu
    用当前最新版vs2019编译opencv最新版4.3.0遇到的问题---
    cuda报错: nvcc fatal : Host compiler targets unsupported OS
    C++中结构体与类的区别(struct与class的区别)
    cmake
    Windows 下配置Boost MPI
    VC----MFC对象的创建总结
    VC++、MFC最好的开源项目
    机械设计人员怎么学习电控?
  • 原文地址:https://www.cnblogs.com/treasury/p/12823226.html
Copyright © 2011-2022 走看看