203. 移除链表元素 - 力扣(LeetCode)
开始写的时候没有想明白的问题
1. 开始我是想头节点 尾节点 中间节点 分开处理 如果删除的是头节点 然后又要删除头节点的后继节点 那么 这样子的话头节点分开处理就毫无意义了 接着是尾节点 开始我定义的是curr = head
当while(head->next)的时候 尾节点的情况我就要在循环外面处理了 但是尾节点的next已经没有大小 指向它 会直接报错
这时 使用一个虚拟头节点newhead->next = head就很好的解决了这个问题 curr = newhead 若curr->next符合条件 直接将 curr->next = curr->next->next 直接把要删除的节点给移除了链表 如果不符合条件 curr = curr->next 这样子的话 也没有让指针越界 也可以很好的处理了头节点的情况
但是我没有真真的释放指针的内存 缺点
- 从链表的结构上看:节点已经被删除,因为链表的指针已经跳过了它。
- 从内存管理上看:被删除的节点还在内存中,除非显式调用
delete
。
/**
* 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 *newHead = new ListNode();
newHead->next = head;
ListNode *pre = newHead;
while ( pre->next ){
if ( pre->next->val == val ){
pre->next = pre->next->next;
}else{
pre = pre->next;
}
}
return newHead->next;
}
};