leetcode203-移除链表元素(单链表带头结点和不带头结点删除特定元素)
203. 移除链表元素
这里的做法是遍历找到需要删除的结点的前一个结点,但由于题目没有给出头结点,所以就有先删除开头符合条件的结点和设置虚拟头结点两种做法
一、释放内存free和delete的区别:
1. delete 用于释放 new 分配的空间,free 有用释放 malloc 分配的空间
2. delete [] 用于释放 new [] 分配的空间
3. delete 释放空间的时候会调用 相应对象的析构函数,new在分配空间的时候同时会调用对象的构造函数,对对象进行初始化,使用malloc则只是分配内存
4. 调用free 之前需要检查 需要释放的指针是否为空,使用delete 释放内存则不需要检查指针是否为NULL
5. free 和 delete 不能混用,也就是说new 分配的内存空间最好不要使用使用free 来释放,malloc 分配的空间也不要使用 delete来释放
所以c++释放内存用delete p;
二、只有当前指针所指向的下一个结点的值不是目标值才能够p=p->next;
一开始因为都p=p->next;就溢出出错了
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* removeElements(ListNode* head, int val) { while(head&&head->val==val) { auto t=head; head = head->next; delete t; } ListNode *p=head; while(p&&p->next) { if(p->next->val==val) { auto t = p->next; p->next=p->next->next; delete t; } else { p=p->next; } } return head; } };
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* removeElements(ListNode* head, int val) { ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点 dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作 ListNode* cur = dummyHead; while (cur->next != NULL) { if(cur->next->val == val) { ListNode* tmp = cur->next; cur->next = cur->next->next; delete tmp; } else { cur = cur->next; } } head = dummyHead->next; delete dummyHead; return head; } };