Simple SingleLinkedList Implementation in C++
You asked about pointer usage, so a topic which may interest you is:

Indirect Pointers

Indirect pointers fall into the "easy to use, difficult to think up" category, but are useful in many cases, so are worth understanding, and apply to a linked list.

In your implementation of deleting a node there are two cases, one where the head should be deleted, and one where somewhere else should be, and in both cases you do roughly the same thing. We can get rid of that duplicated code.

Instead of

node* temp = head;


we can take the pointer to head, like

node** indirect = &amp;head;


and as we go along, we can move indirect to the pointer to this node's next pointer

indirect = &amp;((*indirect)-&gt;next);


Put together, this results in a method which looks something like this:

void SingleLinkedList::deleteNode(node* toBeDeleted){ 
    node* prev = nullptr;
    node** indirect = &amp;head;

    while(*indirect != toBeDeleted){
        prev = *indirect;
        indirect = &amp;((*indirect)-&gt;next);
    }

    *indirect = toBeDeleted-&gt;next;
    delete toBeDeleted;

    if(!(*indirect)) tail = prev;
}


Notice that the special case can be totally removed because, in the first assignment to indirect, indirect contains a pointer to somewhere in the stack (where head is), and in future assignments it has a value in the heap (where the current node is)