One Node Survives

typedef struct node { int val; struct node *next; } node;

node *reverse(node *head) {
    node *prev = NULL;
    while (head != NULL) {
        head->next = prev;
        prev = head;
        head = head->next;
    }
    return prev;
}

The list 1 -> 2 -> 3 -> NULL is passed in. What does reverse return?

A

It loops forever, because head alternates between the first two nodes

B

A one-node list holding 1; the nodes holding 2 and 3 are still allocated but unreachable

C

3 -> 2 -> 1 -> NULL, the intended result

D

1 -> 2 -> 3 -> NULL, unchanged