Don't assign new Nodes to Max or Min, and don't start with the second element!
Instead, set the initial Max and Min pointers to the list head:
struct node *max = head;
struct node *min = head;
struct node *temp = head;
Then use them in your loop:
while (temp != NULL)
{
...
temp = temp->next;
}
Inside the loop, compare the temp value with min and max, and if you find a new value, set the appropriate pointer to temp.
That way, you aren't wasting memory - which you don't free, causing memory leaks - and you cover all elements in the list.
If the list contains one element, the max and min are both the same: the one and only Node.
Try it: it's pretty obvious when you think about it!