【发布时间】:2011-06-18 11:29:23
【问题描述】:
我正在经历一些练习编码问题,我遇到了一个 -
实现一个算法来删除单个链表中间的一个节点, 仅授予对该节点的访问权限。
示例:
输入:链表中的节点“c”a->b->c->d->e
结果:什么都没有返回,但是新的链表看起来像a->b->d->e
解决这个问题的方法是简单地将数据从下一个节点复制到这个节点,然后 删除下一个节点。
上述解决方案将 java 作为编程语言牢记在心。 我想知道已删除节点的内容会发生什么?它的命运在 java 和 c++ 中会有所不同吗? 而且,我认为这个问题的完美答案还应该释放已删除节点的内存。我们如何在 C++ 中做到这一点?
【问题讨论】:
-
对于 C++,每个人要么说“使用
delete”,要么在一种情况下说“使用delete或free”。为了释放内存你必须知道它是如何分配的,所以要完成这个问题,它几乎必须告诉你如何释放内存。由于它在问题中未知,我认为一个完美的答案应该提到我们不知道如何释放节点,或者应该提供完整的列表定义和实现,包括分配。如果该问题是一系列问题中的一个,那么您可能已经在之前的问题中完成了后者。 -
@Steve Jessop - 请详细说明“如何分配”是什么意思?你的意思是在堆栈上还是在堆上?
-
我的意思是使用
new、malloc或一些自定义分配器。在自定义分配器的情况下,它分配的内存池可能恰好在堆栈上,但这并不是重点。或者您可以创建一个自动(“在堆栈上”)列表节点数组,然后将它们链接到一个列表中,然后从列表中删除其中一个。在这种情况下,您什么都不做,当它们超出范围时,它将与其他人一起释放。在 C++ 中有很多方法可以获取内存,因此也有很多方法可以释放它。 -
我认为史蒂夫所说的是列表管理应该与内存管理分离。如果节点的类编写正确,则节点的用户不必同时执行这两项操作。作为列表的用户,您只需从列表中删除节点。节点类应该以这样一种方式编写,即它们会自动被删除(就像在 Java 中一样)。查找
Seporation of Concenrn和smart pointer。
标签: java c++ garbage-collection memory-management linked-list