C语言单项链表逆序问题

{
        struct stu *p1,*p2,*p3;
        p1=head;
        p2=p1->next;            // 这个结点为要移动的结点
        while(p2)
        {
                p3=p2->next;       //记录的为要移动的结点的下一个结点
                p2->next=p1;       //移动结点到最前
                p1=p2;          //移动的结点变为新表头
                p2=p3;          //下个结点变为要移动的结点
        }
        head->next=NULL;        //移动完毕后head变为表尾,让它指向为空
        head=p1;
        return head;
}

head->next=NULL; 这一行,head->next为什么还要指向空呢,head不是一直没移动过吗,指向的地址没变,怎么会变成表尾,让head直接指向头节点不就行了?

注释不都已经说了么,既然逆序了,head就成了链表尾了,自然其next要指向空,如果指向头节点,那就成循环链表了

第12行的head还是原来链表的head,逆序完成后,这个节点就应该是链表的尾结点了,所以它的next就要设为null。
第13行,将head重置为逆序后的头,第14行返回这个头