关于单链表的逆置有关问题

关于单链表的逆置问题
刚开始学数据结构,做一个逆置程序,昨天搜出来一个程序,就是有好多疑问望高手解释下程序。
#include <stdio.h>
typedef   struct   QLink
{
                  int   data;
                  struct   QLink   *next;
}QLink;

main()
{
             
              QLink   *head,*p,*q;
            int   length,i;
            printf( "此程序是实现链表置逆的功能.\n ");
            printf( "请输入链表的长度: ");
            scanf( "%d ",&length);
            printf( "现在要输入各结点的值.\n ");
            for(i=1;i <=length;i++)
            {
                        p=(QLink   *)malloc(sizeof(QLink));
                        scanf( "%d ",&p-> data);
                        p-> next=NULL;
                        if(i==1)   head=p;
                        else
                        {
                                  q=head;
                                  while(q-> next!=NULL)   q=q-> next;   //   这一部分代码什么意思,
                                  q-> next=p;                 //为什么这么写啊??
                        }
            }
            printf( "链表已建立,现在要将它输出.\n ");
            p=head;
            for(i=1;i <=length;i++)
            {
                        printf( "%d     ",p-> data);
                        p=p-> next;
            }
            printf( "\n ");
            printf( "现在要将其置逆.\n ");
            printf( "程序置逆中……\n ");
            printf( "置逆成功.现在要将新的链表输出.\n ");  
            p=head;
            while(head-> next!=NULL)
            {                                                               这一部分是逆置的程序,看不懂什么意思