复杂链表的复制(Python and C++版本)

Posted 孔子?孟子?小柱子!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复杂链表的复制(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 };

以上是关于复杂链表的复制(Python and C++版本)的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer(C++)-JZ35:复杂链表的复制(数据结构-链表)

python解决复杂链表的复制

剑指offer(C++)-JZ35:复杂链表的复制(数据结构-链表)

复杂链表的复制 -python编写

两个链表的第一个公共节点(Python and C++解法)

二叉搜索树与双向链表(Python and C++版本)