/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
 //c语言声明定义全局变量需加上static,防止重复定义
 //分三种情况
 //第一种:头结点指针pHead为null
 //第二种:只有一个结点,即pHead->next为null
 //第三种:有两个以上的结点
       //首先将pHead->next存放到p中
       //然后将pHead->next为null,此时pHead就是新反转链表的头指针了
       //接着写出一个while循环,条件是p->next不为null
           //暂存p->next于temp中
           //修改p->next为pHead,即接上反转链表
           //更新pHead为p,再次成为反转链表的头指针
           //更新p为temp,方便参与循环

/**
 * 
 * @param pHead ListNode类 
 * @return ListNode类
 */
struct ListNode* ReverseList(struct ListNode* pHead ) 
{
    // write code here
    //第一种情况:头结点指针为pHead为NULL
    if(pHead == NULL)
    {
       return NULL;
    }

    //第二种情况只有一个结点pHead->next == NULL
    if (pHead->next == NULL)
     {
        return pHead;
    }

    //第三种情况:有两个以上的结点
    struct ListNode *p = NULL;
    struct ListNode *temp = NULL;
    p = pHead->next;    //首先将pHead->next存放到p中
    pHead->next = NULL;    //然后将pHead->next为null,此时pHead就是新反转链表的头指针了

    //一个while循环,条件是p->next不为null
    while(p->next != NULL)
    {
        temp = p->next;    //暂存p->next于temp中
        p->next = pHead;    //修改p->next为pHead,即接上反转链表
        pHead = p;    //更新pHead为p,再次成为反转链表的头指针
        p = temp;    //更新p为temp,方便参与循环
    }

    //循环结束时,旧链表还剩p指向的结点没连入新反转链表中
    p->next = pHead;
    pHead = p;
    return pHead;
}