C ++:删除后删除链表中的节点,如何?

时间:2015-12-18 03:20:18

标签: c++ c++11 struct

如果我的代码如下:

struct ListNode{
   int val;
   ListNode *next;
   ListNode(int x) : val(x), next(NULL) {}
};

ListNode* delete_first_node(ListNode* head){
    ListNode** pp = &head;
    *pp = (*pp)->next;
    return *pp;
}

C ++将如何释放"头节点"功能是否已处理?

2 个答案:

答案 0 :(得分:4)

函数名称具有误导性,它应该只是名为get_next,因为它不会delete任何东西。它只是以混淆的方式返回head->next

如果要管理(自动)内存,则必须更改为:

struct ListNode{
   int val;
   std::unique_ptr<ListNode> next;
   explicit ListNode(int x) : val(x), next(nullptr) {}
};

void pop_front(std::unique_ptr<ListNode>& head){
    if (head == nullptr) {
        return; // or error
    }
    head = std::move(head->next); // will do the delete for you
}

并使用它

std::unique_ptr<ListNode> head = std::make_unique<ListNode>(42);
// ... fill list as
// head->next = std::make_unique<ListNode>(21);

pop_front(head);

答案 1 :(得分:0)

C ++通常不会自己清除内存,我们应该自己做。

ListNode** pp = &head;
*pp = (*pp)->next;

在上面的代码中,您只是将头部位置移动到下一个。

而不是*pp = (*pp)->next;  你应该重置头部位置,比如,

 head = pp->next; -> move the head to next position
 and then delete pp;-> this will delete the memory of the deleted node.

请注意语法,只是它是伪代码。