两种方法:
a -> b -> c -> NULL
方法一:
判断当前节点的下一个节点是否为空
否:
保存下一个节点
将当前节点的下一个节点指向上一个节点
上一个节点和当前节点分别指向当前节点和当前节点的下一个节点
是:
将当前节点的下一个节点指向上一个节点
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        ListNode* root = pHead;
        ListNode* pre = NULL;
        ListNode* next = NULL;
        if(pHead == NULL)
            return NULL;
        while(root->next){
            next = root->next;
            root->next = pre;
            pre = root;
            root = next;
        }
        root->next = pre;
        return root;
    }
};
方法二:
判断当前节点是否为空
否:
保存当前节点的下一个节点
判断是否为空
    是:返回该链表
当前节点的下一个节点变为前一个节点
上一个节点和当前节点分别指向当前节点和当前节点的下一个节点
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead)
    {
        ListNode* pRes = NULL;
        ListNode* pNode = pHead;
        ListNode* pPrev = NULL;
        while(pNode != NULL)
       {
            ListNode* pNext = pNode->next;

            if(pNext == NULL)
                pRes = pNode;

            pNode->next= pPrev;

            pPrev = pNode;
            pNode = pNext;
        }

        return pReversedHead;
    }

};