删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5方法:哨兵节点 如果删除的节点是中间的节点,则问题似乎非常简单: 选择要删除节点的前一个结点 prev。 将 prev 的 next 设置为要删除结点的 next。

当要删除的一个或多个节点位于链表的头部时,事情会变得复杂。

可以通过哨兵节点去解决它,哨兵节点广泛应用于树和链表中,如伪头、伪尾、标记等,它们是纯功能的,通常不保存任何数据,其主要目的是使链表标准化,如使链表永不为空、永不无头、简化插入和删除。

在这里哨兵节点将被用于伪头。
算法:
初始化哨兵节点为 ListNode(0) 且设置 sentinel->next = head。 初始化两个指针 curr 和 prev 指向当前节点和前继节点。 当 curr != nullptr: 比较当前节点和要删除的节点: 若当前节点就是要删除的节点:则 pre->next = curr->next。 否则设 prve = curr。 遍历下一个元素:curr = curr->next。 返回 sentinel->next。
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* sentinel=new ListNode(0);
sentinel->next=head;
ListNode* pre=sentinel;
ListNode* toDelete = nullptr;
while(head){
if(head->val==val){
toDelete=head;
pre->next=head->next;
head=head->next;
continue;
}
pre=head;
head=head->next;
if(toDelete!= nullptr){
delete toDelete;
toDelete=nullptr;
}
}
return sentinel->next;
}
};时间复杂度:O(N),只遍历了一次。 空间复杂度:O(1)。