/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @return ListNode类
 */
struct ListNode* ReverseList(struct ListNode* head ) {
    // write code here
    struct ListNode *pre=NULL;
    struct ListNode *cur=head;
    struct LisrNode *after=NULL;
    while(cur!=NULL)
    {
        after=cur->next;
        cur->next=pre;
        pre=cur;
        cur=after;
    }
    return pre;//当cur是空结点时,pre就是最后一个有效结点
}
//解题思路:定义三个指针完成这道题目,*pre,*cur,*after;分别表示前一个,当前,后一个判断的结点指针
//先赋初值,当前赋初值头指针,其他为NULL,
//判断当前是否为有效结点 while(cur)也行,如果是,执行以下操作
//先将*after指向cur的后一个结点;定义一下刚才没定义的after指针,因为当cur不为空时after的定义才有意义。
//逆转指向:将cur当前所指重新定义指向前一个结点,即cur=pre;
//一开始pre为空,所以cur重新指向的也是空
//此时完成逆转指向,然后准备下一次的判断,要先将pre跟上cur,cur再向后走到after;
//即pre=cur;cur=after;