题目描述
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点
e.g.
题解
对于链表类的题,由于头节点较难操作,我们可以在头节点前插入一个虚拟节点,这种头节点可以和中间节点以相同方式处理,便于操作
/**
* 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;
ListNode* curr=dummyhead;
while(curr->next!=nullptr)//遍历到倒数第二个即可
if(curr->next->val==val)//把下一个的下一个给到下一个,然后把要删除的delete掉
{
ListNode* temp=curr->next;
curr->next=curr->next->next;
delete temp;
}
else//不需要删除时直接转到下一个
{
curr=curr->next;
}
head=dummyhead->next;//最后不要忘记把head结点给回虚拟节点的下一个
delete dummyhead;//释放虚拟节点的内存
return head;
}
};
注意事项
1.处理链表学会善用虚拟节点,否则头节点难以处理
2.用C++删除节点时要善做“内存管理带师”,删除的结点要从内存中delete