本文参考代码随想录
删除链表中等于给定值val的所有节点
在链表中部的元素直接删除即可,c++需要手动释放空间。但在删除头节点时,针对单链表有两种操作方式。
- 直接使用原来的链表进行删除操作
直接将头结点后移一位,然后移除原头结点的内存。
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
while(head != NULL && head->val == val){//删除头结点
ListNode* tmp = head;
head = head -> next;
delete tmp;
}
ListNode* cur = head;
while(cur != NULL && cur -> next != NULL){
if(cur -> next -> val == val){
ListNode* tmp = cur -> next;
cur -> next = cur -> next -> next;
delete tmp;
}else{
cur = cur -> next;
}
}
return head;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
- 设置虚拟头结点。returndummyNode->next
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead = new ListNode(0);//虚拟头结点
dummyHead -> next = head;
ListNode* cur = dummyHead;
while(cur -> next != NULL){
if(cur -> next -> val == val){
ListNode* tmp = cur -> next;
cur -> next = cur -> next -> next;
delete tmp;
}else{
cur = cur->next;
}
}
head = dummyHead -> next;
delete dummyHead;
return head;
}
};
时间复杂度:O(n)
空间复杂度:O(1)