Вам нужна помощь в понимании разницы?
Представьте себе вызывающую функцию в первом случае:
IntElement *head;
int data;
...
insertInFront (head, data);
Теперь в этом случае адрес, на который указывает голова, помещается в стек и передается как аргумент для insertInFront. Когда insertInFront делает head = newElement; изменяется только аргумент (в стеке).
Во втором случае вызывающий абонент будет:
IntElement *head;
int data;
...
insertInFront (&head, data);
В этом случае адрес головы помещается на стек и передается в качестве аргумента для insertInFront. Когда вы делаете * head = newElement, это переданное в адресе де-ссылку, чтобы получить адрес исходной главы списка, и это было изменено.