'node not getting deleted if it's the head [closed]

This is my code, the important part at least. Whenever I run it and try to delete the head node, it won't work (the output will be a large negative number). It will work for all other nodes.

Is it something with my code, or you just can't replace the head?

node* displayList(node* head) {
    node* curr = head;
    while (curr != NULL) {
        cout << curr->data << " ";
        curr = curr->next;
    }
    return NULL;
}

node* deleteVal(node* head, int val) {
    node* cur, * prev;
    if (head == NULL)
        return head;
    
    if (head->data == val) {
        cur = head->next;
        delete head;
        head = cur;
        return head;
    }
    cur = head;
    prev = NULL;
    while (cur->data != val && cur != NULL) {
        prev = cur;
        cur = cur->next;
    }
    if (cur == NULL) {
        return head;
    }
    prev->next = cur->next;
    return head;
}

int main() {
    node* head1 = initNode(), * head2=initNode(), * head3 = initNode();
    int val;
    head1 = input();
    head2 = input();
    head3 = input();
    conca(head1, head2, head3);
    cout << "the concatated list is: ";
    displayList(head1);
    cout << endl<<"enter the value you want to delete: ";
    cin >> val;
    deleteVal(head1, val);
    cout << "the new list is: ";
    displayList(head1);
    return 0;
}


Solution 1:[1]

For starters the condition of the while loop

while (cur->data != val && cur != NULL) {
    prev = cur;
    cur = cur->next;
}

must be changed like

while ( cur != nullptr && cur->data != val) {
    prev = cur;
    cur = cur->next;
}

Also you need indeed to delete the found node like

prev->next = cur->next;
delete cur;
return head;

And in main you have to reassign the pointer to the head node like

head1 = deleteVal(head1, val);

With shown updates the function can look the following way

node* deleteVal(node* head, int val) {
    node* cur, * prev;
    if (head == NULL)
        return head;
    
    if (head->data == val) {
        cur = head->next;
        delete head;
        head = cur;
        return head;
    }
    cur = head;
    prev = NULL;
    while ( cur != NULL && cur->data != val ) {
        prev = cur;
        cur = cur->next;
    }
    if (cur == NULL) {
        return head;
    }
    prev->next = cur->next;
    delete cur;
    return head;
}

And in main write

head1 = deleteVal(head1, val);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1