题目描述:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
代码:AC
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}//结构体里的构造函数
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
//特殊处理
if(head==nullptr || n<=0)
return NULL;
//处理
ListNode* ptr1 = head;
ListNode* ptr2 = head;
for(int i=0;i<n;i++)
{
ptr2 = ptr2->next;
}
//若要删除的要删除的节点是头结点,则ptr2就走到空指针那里了
if(!ptr2)
return head->next;
while(ptr2->next != nullptr)
{
ptr1 = ptr1->next;
ptr2 = ptr2->next;
}
//删除
ptr1->next = ptr1->next->next;
return head;
}
};
问题: 为什么没有delete要删除的指针?难道是leecode里不用释放空间?
笔记:关于delete和malloc
delete
用于释放 new 分配的空间,free
用于释放 malloc 分配的空间。delete []
用于释放 new [] 分配的空间。- delete 释放空间的时候会调用 相应对象的析构函数;
new在分配空间的时候同时会调用对象的构造函数,对对象进行初始化,使用malloc则只是分配内存。 - 调用free 之前需要检查需要释放的指针是否为空,使用delete 释放内存则不需要检查指针是否为NULL。
- free 和 delete 不能混用,也就是说new 分配的内存空间最好不要使用使用free 来释放,malloc 分配的空间也不要使用 delete来释放。