* struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

/**
 * 
 * @param pHead ListNode类 
 * @return ListNode类
 */
struct ListNode* ReverseList(struct ListNode* pHead ) 
{
	//本题 头结点为第一个结点 pHead
	//当为空、或者 只有一个元素时直接退出
    if(pHead == NULL)
        return NULL;
    if(pHead->next == NULL)
        return pHead;
    
    //至少两个元素时
    //定义两个空指针
    struct ListNode *p = NULL;
    struct ListNode *temp = NULL;
 	 //p是第二个结点 断开头结点指向空
    p = pHead->next;
    pHead->next = NULL;
    //第二个结点的下一个结点不为空
    while(p->next != NULL)
    {
    	//不为空 ,则 temp记录p的下一个结点
        temp = p->next;
        
        //结点p 指向头结点
        p->next = pHead;
        
        //p设置为头结点
        pHead = p;
        
        //把p 拉回来
        p = temp;
    }
	//退出时 p 是最后一个结点  也是最终目标链表头结点
    
    //p 指向头结点  
    p->next = pHead;
	//p设置为头结点
    pHead = p;
    //返回 pHead
    return pHead;
}