
通过本题学习了虚拟头节点的用法。增加一个虚拟头节点(指向头节点的节点),可以将链表元素统一处理,不用单独处理头节点。
注意C++编程删除节点,需要手动释放内存。
自己犯的错误:删除节点后,cur不要立马后移,新的cur -> next也可能需要删除。
涉及删除操作的时候循环停止条件为cur -> 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) {
ListNode* preHead = new ListNode(0, head); //虚拟头节点
ListNode* cur = preHead; //移动指针
while(cur -> next != NULL){
if(cur -> next -> val == val){
ListNode* tmp = cur -> next;
cur -> next = cur -> next -> next;
delete tmp; //释放内存
}else{
cur = cur -> next;
}
}
return preHead -> next; //返回真正的头节点
}
};