力扣203. 移除链表元素(哑节点,哨兵节点遍历)
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4->5
哑节点,哨兵节点遍历
开一个哑节点,prev保留前一个节点指针,curr代表是否需要删除的节点指针。
- 如果要删除,prev->next=curr->next; curr=curr->next;
- 如果不删除,prev=prev->next; curr=curr->next;
复杂度分析
- 时间复杂度:O(N),只遍历了一次。
- 空间复杂度:O(1)。
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* removeElements(ListNode* head, int val) {if(head==nullptr)return head;ListNode* dummy=new ListNode(INT_MIN);dummy->next=head;ListNode* prev=dummy;ListNode* curr=head;ListNode* deletep=nullptr;while(curr!=nullptr){if(curr->val==val){deletep=curr;prev->next=curr->next;curr=curr->next;delete(deletep);}else{prev=prev->next;curr=curr->next;}}return dummy->next;}
};