思路
用双指针来遍历链表,找到要删除的节点后进行删除。在头节点之前增加一个 dummy
节点,这样当要删除的节点是否为头节点都可以统一处理。
以 head=[4,5,1,9]
,val=5
为例:
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
if(head==nullptr){
return head;
}
ListNode* dummy=new ListNode(0);
dummy->next=head;
ListNode* prev=dummy;
ListNode* curr=head;
while(curr!=nullptr&&curr->val!=val){
curr=curr->next;
prev=prev->next;
}
if(curr==nullptr){
return head;
}
prev->next=curr->next;
curr->next=nullptr;
return dummy->next;
}
};
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)