【发布时间】:2011-02-20 14:54:44
【问题描述】:
我正在尝试深度复制链接列表。我需要一个在线性时间 O(n) 中执行的算法。这是我现在所拥有的,但我无法弄清楚它出了什么问题。我的应用程序崩溃了,我怀疑是内存泄漏,我还没有弄清楚。这就是我现在拥有的
struct node {
struct node *next;
struct node *ref;
};
struct node *copy(struct node *root) {
struct node *i, *j, *new_root = NULL;
for (i = root, j = NULL; i; j = i, i = i->next) {
struct node *new_node;
if (!new_node)
{
abort();
}
if (j)
{
j->next = new_node;
}
else
{
new_root = new_node;
}
new_node->ref = i->ref;
i->ref = new_node;
}
if (j)
{
j->next = NULL;
}
for (i = root, j = new_root; i; i = i->next, j = j->next)
j->ref =i->next->ref;
return new_root;
}
谁能指出我哪里出了问题?
【问题讨论】:
-
假设它是 C++ 是否正确?
-
是的。 C++ 或 Ansi C 。我可以在其中任何一个中使用实现
-
发布一个完整的可编译示例,以便人们可以帮助您。也许你也应该尝试在你的代码中使用像 valgrind 这样的工具。
-
ref 是干什么用的?这是树形结构吗?是否需要复制引用节点,或者目标列表中的引用节点是否将指向源列表中的相同引用节点?
-
ref 持有对列表中随机节点的引用。理想情况下,引用节点应该指向新复制列表中的节点,并且不应该依赖于原始源列表。
标签: c++ c algorithm linked-list