如何在C++中正确删除链表的节点
How do I properly delete nodes of linked list in C++
我觉得我实际上并没有删除节点并释放内存。我想我只是在移动指针,所以当我打印链接列表时,列表不会打印我删除的元素。所以我的问题是,我是真的在删除节点,还是只是简单地重新排列指针,使其看起来像是在删除节点(本质上只是断开链接,而不是删除节点)?谢谢你的帮助。
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;
}
Node *current = new Node;
Node *previous = new Node;
此代码会导致内存泄漏-您永远不会删除此内存。您可以在没有内存分配的情况下声明指针:
Node *current = nullptr;
Node *previous = nullptr;
delete
将删除指针的内存,因此您将实际删除节点。但是对Node*
使用delete[]是不正确的,它应该只用于数组-用new[]
分配的内存。使用不当会导致不明确的行为。因此,要正确删除节点,请使用运算符delete删除它们。
使用内存泄漏检测工具来了解程序中是否存在内存泄漏。
删除列表元素的代码:例如,我们有指向列表头部的pHead(但如果你自己写这样的东西,它会给你更多):
Node* pCur = pHead;
Node* pPrev = pCur;
while (pCur && pCur->data != target) {
pPrev = pCur;
pCur = pCur->next;
}
if (pCur==nullptr) // not found
return NOT_FOUND;
if (pCur == pHead) { // first element matches
pHead = pCur->next;
} else {
pPrev->next = pCur->next;
}
// pCur now is excluded from the list
delete pCur; // deallocate its memory
使用指针到指针的替代方案(社区添加)
当您使用列表中的实际指针执行枚举时,以上内容可能会有新的含义。以下内容从pp
被分配头指针的地址开始(而不是它指向的节点;实际指针本身)。我们遍历列表,直到pp
保存指向要删除目标的节点的指针的地址(可以是头指针,也可以是某个节点中的next
指针,没有区别)。被寻址的指针被设置为其自身节点的next
值,然后删除目标节点。
这真的应该在调试器中观察,看看它是如何工作的,但考虑到真正发生的事情,算法非常简单:
Node **pp = &pHead;
while (*pp && (*pp)->data != target)
pp = &(*pp)->next;
if (*pp)
{
Node *victim = *pp;
*pp = victim->next;
delete victim;
}
这就是的全部。而且你可以免费删除头部节点,而无需对其进行特殊处理。希望这也能有所帮助。
相关文章:
- 我们可以删除链表中静态内存中的节点吗
- C++删除链表中的元素
- 删除链表中的特定节点
- 删除链表中的节点 - 分段错误
- 使用函数引用指向节点的指针删除链表中的节点?
- 尝试删除链表的头部或中间节点时出错
- 如何删除链表中的特定节点
- 两次删除链表有什么区别?
- 当链表是列表中唯一的节点时,删除链表的头部.单联
- 删除链表节点,C++函数不起作用
- unique_ptr:删除链表条目
- 删除链表的每隔一个节点
- 如何在C++中正确删除链表的节点
- 通过此方法删除链表中的数据会发生什么情况
- 如何在C++中删除链表中的节点?
- 如何"completely"删除链表中的所有节点?
- 删除链表中的每三个节点
- 分段 删除链表的项目时出错
- 删除链表中的节点
- 删除链表中的节点函数