带有随机指针的链表的深层副本
Deep copy of a linked list with a random pointer
这是一个leetcode面试问题,要求链表的深层副本,该链表具有可以指向任何元素的random
成员。(https://leetcode.com/problems/copy-list-with-random-pointer(。我无法弄清楚为什么我的解决方案会为未对齐的访问提供运行时错误。
这是我的解决方案:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node() {}
Node(int _val, Node* _next, Node* _random) {
val = _val;
next = _next;
random = _random;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
unordered_map<Node*, Node*> node_map;
Node* copy_head = new Node();
Node* node = head;
Node* copy = copy_head;
while (node) {
node_map[node] = copy;
copy->val = node->val;
if (node->next)
copy->next = new Node();
node = node->next;
copy = copy->next;
}
node = head;
copy = copy_head;
while (node) {
copy->random = node_map[node->random];
node = node->next;
copy = copy->next;
}
return copy_head;
}
};
您的第一个while
循环不是分配链表新副本的首选或规范方法。应该只有 1 次调用new
,在循环内,而不是在循环外。如果head
为 null,则您仍在分配不应分配的Node
。
更重要的是,您的复制代码使用Node
的默认构造函数不会初始化任何数据成员,尤其是next
指针。因此,您最后复制的节点将具有一个随机不确定的值,该值可能不是 null,因此它不会正确终止列表。
尝试更多类似的东西:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node() {}
Node(int _val, Node* _next, Node* _random) {
val = _val;
next = _next;
random = _random;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
if (!head)
return nullptr;
unordered_map<Node*, Node*> node_map;
Node* copy_head = nullptr;
Node** copy = ©_head;
Node* node = head;
do {
*copy = new Node(node->val, nullptr, nullptr);
node_map.insert(make_pair(node, *copy));
copy = &((*copy)->next);
node = node->next;
}
while (node);
node = copy_head;
do {
if (head->random)
node->random = node_map[head->random];
node = node->next;
head = head->next;
}
while (head);
return copy_head;
}
};
问题是您的副本没有以空指针终止。也就是说,它的最后一个节点不会将nullptr
存储在其next
成员变量中。
您可以通过new node()
创建副本的节点,这将调用默认构造函数。但是,此默认构造函数不执行任何操作,包括不初始化成员变量。因此,您需要将最后一个节点的next
设置为手动nullptr
。
相关文章:
- 反向给定链表中的K节点
- 如果没有malloc,链表实现将失败
- 文本文件中的单词链表
- 努力将整数转换为链表。不知道我在这里做错了什么
- 链表,反向函数,数据结构
- 使用std::list创建循环链表
- 链表的泛型函数remove()与成员函数remove)
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 我们可以删除链表中静态内存中的节点吗
- C++,指针数组,指向双链表中的条目
- 链表中写入访问冲突的未知原因
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 打印所有链表的元素 (C++)
- 错误:需要类名(链表c++)
- 为什么C中的通用链表中存储的数据已损坏
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 对如何制作双链表的深度副本感到困惑?
- 带有随机指针的链表的深层副本
- C++ 如何创建链表的副本作为类对象
- c++制作一个链表的深层副本