【发布时间】:2014-04-02 23:53:39
【问题描述】:
我感觉好像我并没有真正删除节点并释放内存。我想我只是在移动指针,所以当我打印链接列表时,列表不会打印我删除的元素。所以我的问题是我实际上是在删除节点还是只是简单地重新排列指针,所以看起来我正在删除节点(基本上只是断开链接但不删除节点)?感谢您的帮助。
void SLL::deleteNode(int target){
Node *current = new Node;
Node *previous = new Node;
for (current = front->next, previous = front; current != NULL; current = current->next, previous=previous->next){
if (previous->data == target && previous == front){
front = previous->next;
delete[] previous;
return;
//This if statement deletes the element if its the front
}
else {
if (previous->data == target && previous->next == NULL){
previous = NULL;
delete[] current;
return;
//This if statement deletes the node if it is the back
}
else if (current->data==target)
{
previous->next = current->next;
delete[] current;
return;
//This if statement deletes a node if it is in the middle
}
}
}
delete[] current;
delete[] previous;
}
【问题讨论】:
-
当你将
current和previous声明为单个实例时,为什么要使用数组删除(delete [])版本? -
用
front->next开始你的枚举算法是令人担忧的。 请告诉我们您没有使用实际上不包含数据的预分配“头”节点。它不是必需的。除非你用new Node[n]分配你的节点,否则你使用了错误的delete操作符。 -
我不知道。我试过这个它有效。请回答问题。
-
不知道什么?你的前端指针是否是哨兵节点?您的节点是否分配有 vector-
new?你写的代码,对吧?顺便说一句,你在这个函数的头部分配的两个节点会立即被泄露,所以我可以向你保证,无论你是否删除了目标节点,最终回收的内存都是零。 -
你
delete[]在你的第二个块中是一个空向量,但我不认为控制可以进入那个块,所以我想它没有实际意义。
标签: c++ linked-list nodes