在下面给出的函数中,我只需删除列表的头指针并将头指针设置为nullptr
(将其设置为nullptr
,因为在我的打印函数中,我检查{{1} }作为头节点,如果头节点为nullptr
,则要求用户首先创建列表。
nullptr
我对选择删除列表的方式有疑问,因为我没有清除列表的每个节点,而是只是清除了头指针,所有其他节点将如何处理?这种方法会造成内存泄漏吗?
编辑:
我不使用OOP实现链表,而是使用struct和函数对实现链表。
答案 0 :(得分:0)
您的代码将导致内存泄漏。要正确删除它,请遍历列表,并在遍历时分别删除每个节点。最后使头部指针指向NULL值。您可以查看以下代码。
void deleteList(struct Node** head_ref)
{
struct Node* current = *head_ref;
struct Node* next;
while (current != NULL)
{
next = current->next;
free(current);
current = next;
}
//Now make head_ref point to null
*head_ref = NULL;
}
答案 1 :(得分:0)
我喜欢递归处理此问题:
void deleteNode(Node * head)
{
if(head->pNext != NULL)
{
deleteNode(head->pNext)
}
delete head;
}
如果我们有5个项目的列表:
head-> pNext-> pNext-> pNext-> pNext-> NULL;
然后,将首先为head调用该函数,然后为每个pNext调用该函数,直到最后一个调用。当我们到达最后一个时,它将跳过删除下一个(因为它为null),而只删除最后一个pNext。然后返回并从后到前删除列表。
这是假设每个节点的pNext都初始化为NULL。否则,您将永远不知道何时到达链接列表的末尾。