题目描述

输入一个链表,反转链表后,输出链表的所有元素。

三个指针 pre ,cur,next

初始状态,pre是NULL,cur指向当前的头节点Hhead,next指向头节点Hhead的下一个节点B。首先从A节点开始逆序,将A节点的next指针指向prev,因为prev的当前值是NULL,所以A节点就从链表中脱离出来了,然后移动head和next指针,使它们分别指向B节点和B的下一个节点C(因为当前的next已经指向B节点了,因此修改A节点的next指针不会导致链表丢失)。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {

        ListNode* head = NULL;
        ListNode* pre = NULL;
        ListNode* pnext = head->next;
        head = pHead;
        if(pHead == NULL)
        {
            return NULL;
        }
        while(head != NULL)
        {
        //先保存head的next节点,再让head指向前驱结点
            pnext = head->next;
            head->next = pre;
        //让head 和pre两个指针向前走
            pre = head;
            head = pnext;
        }
        return pre;
    }
};
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        //如果链表为空或者链表中只有一个元素
        if(pHead==NULL||pHead->next==NULL) 
        {
            return pHead;
        }
        ListNode* pre = NULL;
        ListNode* cur = pHead; 
        ListNode* pnext = cur->next;

        while(cur)
        {
            pnext = cur->next;
            cur->next = pre;
            pre = cur;
            cur = pnext;           
        }

          return pre;

    }
};
//第二种方法是:递归方法 /*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        //如果链表为空或者链表中只有一个元素
        if(pHead==NULL||pHead->next==NULL) return pHead;

        //先反转后面的链表,走到链表的末端结点
        ListNode* pReverseNode=ReverseList(pHead->next);

        //再将当前节点设置为后面节点的后续节点
        pHead->next->next=pHead;
        pHead->next=NULL;

        return pReverseNode;

    }
};