Delete all occurrences of an item in linked list
Yes, your code can be improved by not handling the head as a special case. Yes, that means using a double-pointer, but the structure gets much more straight-forward and shorter:

void LinkedList::DeleteAllOccurences(int key) {
    Node** p = &amp;head;
    while(*p)
        if((*p)-&gt;item == key) {
            Node* tmp = (*p)-&gt;next;
            delete *p;
            *p = tmp;
        } else
            p = &amp;(*p)-&gt;next;
}