这是删除整个链表的有效方法吗?

时间:2018-12-23 22:43:52

标签: c++ linked-list

在下面给出的函数中,我只需删除列表的头指针并将头指针设置为nullptr(将其设置为nullptr,因为在我的打印函数中,我检查{{1} }作为头节点,如果头节点为nullptr,则要求用户首先创建列表。

nullptr

我对选择删除列表的方式有疑问,因为我没有清除列表的每个节点,而是只是清除了头指针,所有其他节点将如何处理?这种方法会造成内存泄漏吗?

编辑:

我不使用OOP实现链表,而是使用struct和函数对实现链表。

2 个答案:

答案 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。否则,您将永远不知道何时到达链接列表的末尾。