想了好久都没看懂题目,感觉单向链表只给出当前节点的话是没有办法删除此节点的,然后看了题解,感觉不知道谁比较蠢。。。
class Solution {
public:
void deleteNode(ListNode* node) {
node->val = node->next->val;
node->next = node->next->next;
}
};
题解给的方法并没有删除这个节点,会造成内存泄漏。实际在单链表中删除一个节点需要链表的头,找到这个节点的前一个节点然后使用delete或者free进行删除操作。或者将这个节点换成下个节点的值,删除下个节点:
class Solution {
public:
void deleteNode(ListNode * node) {
ListNode *temp=node->next;
node->val=temp->val;
node->next=temp->next;
delete temp;
}
};
查了一下delete和free的区别:
1. delete用于释放 new 分配的空间,free用于释放malloc分配的空间。
2. delete [] 用于释放 new [] 分配的空间。
3. delete 释放空间的时候会调用 相应对象的析构函数。new在分配空间的时候同时会调用对象的构造函数,对对象进行初始化,使用malloc则只是分配内存。
4. 调用free之前需要检查要释放的指针是否为NULL,使用delete 释放内存则不需要检查指针是否为NULL。
5. free和delete不能混用,也就是说new分配的内存空间不要使用free来释放,malloc分配的空间也不要使用delete来释放。