复杂链表的复制(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 };
posted @ 2020-07-10 16:24  孔子?孟子?小柱子!  阅读(173)  评论(0编辑  收藏  举报