Implementation B, is the correct one.
If you modify Implementation One following then it will also work correctly.
Node *insert (Node * head, int data){
Node *newNode = (Node *)malloc(sizeof(Node));
newNode -> data = data;
newNode -> next = head;
head = newNode;
return head;
}
Implementation B is working correctly just because you are passing the address of head pointer, hence its can be updated from insert function, we do not need to return the value.