zoukankan      html  css  js  c++  java
  • 复杂链表的复制(Python and C++版本)

    题目:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof

    思路:

      该链表的特点和有向图的特点一样,故可以转化为图使用BFS或者DFS实现。

      如果使用迭代的方法,需要先把每个节点复制一次,然后依次加next关系和random关系。

      为了存储节点的关系,使用哈希表存储。

    Python解法:

     1 class Node:
     2     def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
     3         self.val = int(x)
     4         self.next = next
     5         self.random = random
     6 
     7 class Solution:
     8     def copyRandomList(self, head: 'Node') -> 'Node':
     9         if head == None:    return head
    10         # 哈希表存储原节点与对应节点的关系,python哈希表不含默认值,所以尾结点为空的关系要加入!!!!!!!!!!!!!!!!!!!!!
    11         mp = {None:None}
    12         copyNode = head
    13         while copyNode:  # 把链表节点复制一份
    14             mp[copyNode] = Node(copyNode.val)
    15             copyNode = copyNode.next
    16 
    17         copyNode = head  # 回到起点
    18         while copyNode:
    19             mp[copyNode].next = mp[copyNode.next]  # 连接拷贝节点的next
    20             mp[copyNode].random = mp[copyNode.random]  # 连接拷贝节点的rangdom
    21             copyNode = copyNode.next
    22 
    23         return mp[head]

    C++解法:

     1 class Node {
     2 public:
     3     int val;
     4     Node* next;
     5     Node* random;
     6 
     7     Node(int _val) {
     8         val = _val;
     9         next = NULL;
    10         random = NULL;
    11     }
    12 };
    13 
    14 class Solution {
    15 public:
    16     Node* copyRandomList(Node* head) {
    17         if (head == NULL)    return head;
    18         // unordered_map的底层是哈希表,默认值为空,所以节点为空的情况不需要单独存储!!!!!!!!!!!!!!!!
    19         unordered_map<Node*, Node*> mp;
    20         Node *copyNode = head;
    21         while (copyNode != NULL) {
    22             mp[copyNode] = new Node(copyNode->val);  // 复制每个节点
    23             copyNode = copyNode->next;
    24         }
    25         copyNode = head;  // 回到起点
    26         while (copyNode != NULL) {
    27             mp[copyNode]->next = mp[copyNode->next];  // 连接next节点
    28             mp[copyNode]->random = mp[copyNode->random];  // 连接random节点
    29             copyNode = copyNode->next;
    30         }
    31         return mp[head];
    32     }
    33 };
  • 相关阅读:
    C#设计模式之订阅发布模式
    ASP.NET Core依赖注入(DI)
    ASP.NET 开源导入导出库Magicodes.IE 完成Csv导入导出
    .NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
    曾经优秀的人,怎么就突然不优秀了?
    IDEA中文注释难看的简单解决办法
    JasperReport报表中输出Excel时,部分列不显示的问题
    为什么Spring Security看不见登录失败或者注销的提示
    JQuery文件上传插件JQuery.upload.js的用法简介
    一个很酷炫也挺实用的JS库leader-line
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13279874.html
Copyright © 2011-2022 走看看