问题
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
分析
方法1.哨兵节点
为了防止删除值相同的头结点后,可能新的头结点也值相等,所以在头结点之前再添加一个虚拟节点,其主要目的是使链表标准化,如使链表永不为空、永不无头、简化插入和删除。
算法:
- 初始化哨兵节点为 ListNode(0) 且设置 sentinel.next = head。
- 初始化两个指针 cur 和 pre指向当前节点和前继节点。
- 当 cur != nullptr:
比较当前节点和要删除的节点:
若当前节点就是要删除的节点:则 pre.next = cur.next。
否则设 pre = cur。
遍历下一个元素:cur = cur.next。
返回 sentinel.next。
代码如下:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* sintinel=new ListNode(0);
sintinel->next=head;
ListNode* pre=sintinel;
ListNode* cur=head,*temp=nullptr;
while(cur!=nullptr)
{
if(cur->val==val)
{
pre->next=cur->next;
temp=cur;
}
else pre=cur;
cur=cur->next;
}
ListNode* ret=sintinel->next;
return ret;
}
方法2递归
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if(head==nullptr)
{
return head;
}
head->next=removeElements(head->next,val);//逐步递归到head指向最后一个节点
//如果head值等于val,则让前一个节点指向head.next
if(head->val==val)
{
return head->next;
}
else
{
return head;
}
}
};