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)
    
  • 相关阅读:
    Redis学习之一--基础知识
    工作流学习之--TPFlow数据库分析
    什么是域名?什么网站名?什么是URL
    SASS的升级版--SCSS 基本介绍+Sass使用详解
    vue调试工具vue-devtools的安装(win10系统,最新2020年6月的解决方案)
    如何运行vue项目
    用WebStorm搭建vue项目
    Terminal怎么停止VUE项目
    VUE 在一个组件中引用另外一个组件的两种方式
    Vue.js——60分钟快速入门 开发· webpack 中文文档
  • 原文地址:https://www.cnblogs.com/treasury/p/12823226.html
Copyright © 2011-2022 走看看