我今天开始学习链表,我正在尝试删除节点。
void deleteEnd(Node* refNode) {
Node* lastNode;
lastNode = new Node;
while((refNode->next)->next != NULL) {
refNode = refNode->next;
}
lastNode = refNode->next;
refNode->next = NULL;
delete lastNode;
}
void deleteIndex(Node* refNode, int index) {
Node *prev, *next, *deleted;
prev = new Node;
next = new Node;
deleted = new Node;
for(int i=1; i < index; i++) {
refNode = refNode->next;
}
prev = refNode;
deleted = prev->next;
next = deleted->next;
prev->next = next;
free(deleted);
}
我可以在第一个中使用delete
,但当我尝试在第二个中使用它时,它不起作用。终端没有给出任何错误消息。
我在网上找到了一些信息,但我真的无法理解
这是我的链接列表:
class Node {
public:
int data;
Node *next;
};
正如评论所指出的,这段代码有几个问题。所有问题都来自评论,我没有发现,所有的功劳都归于弗朗索瓦·安德里厄、Jesper Juhl、Sven Nilson、Avi Berger和Thomas Matthews。
首先,代码可能不起作用,因为您混合了new
和free
。new
是一个C++API函数,而free
来自C。当您使用new
构造对象时,必须使用delete
释放它,这在C++的自动内存管理中并不常见。
第二,当在列表中循环时,始终从0开始。否则的唯一原因是从第二个项目开始。
第三,在本文中:
prev = new Node;
...
prev = refNode;
...
prev->next = next;
当您设置prev
时,它将覆盖以前的值。如果这是一个指针,那么这会导致内存泄漏。重写前始终delete
。
最后,正如Thomas Matthews所指出的,在deleteEnd
中,您试图取消引用指针或从指针中获取值,而不检查它是否为nullptr
。如果是,它将导致未定义的行为,并可能导致程序崩溃。