When head is NULL, you are not setting ->next to NULL when you build the list.

Code:
  Node *temp = ptrNode;
  while(ptrNode != NULL){
    ptrNode = ptrNode->next;
    delete temp;
    temp = NULL;
  }
Within the loop, you delete the memory pointed to by temp, but you only set temp once before the loop and not within the loop, so only the memory initially pointed to by ptrNode is deleted. Also note that printList() changes the value of ptrNode - so should be set to head before each call to printList() and before PART 2.

Also note that in c++, to refer to a null ptr then rather than NULL, nullptr is used so
Code:
Node* head = nullptr;