24剑指OFFER之反转链表

参考资料:

[1]剑指OFFER课本 P143

关键词:

定义3个指针,图解说明

图解说明:


24剑指OFFER之反转链表_第1张图片
反转链表.png
自己的解法(会不会的关键!!!):
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        
        //定义3个指针,前一个指针,当前指针,下一个指针
        ListNode* pPre = nullptr;
        ListNode* pNode = pHead;
        ListNode* pNext = nullptr;
        
        //反转后链表的头节点
        //竟然通过了。思路见图解说明
        ListNode* pReverseHead = nullptr; 
        
        while(pNode != nullptr)
        {
            pNext = pNode->next;
            pNode->next = pPre;
            
            pReverseHead = pNode;
            
            pPre = pNode;
            pNode = pNext;
        }
        return pReverseHead;
                
        
    }
};
标准答案解法:
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        
        //如果头结点为空结点,返回nullptr
        if(pHead == nullptr)
            return nullptr;
        
        
        //定义3个指针,当前节点,下一个节点和前一个节点
        ListNode* pNode = pHead;
        ListNode* pNext =nullptr;
        ListNode* pPrev =nullptr;
        
        ListNode* pNewHead =nullptr;
        
        while(pNode != nullptr)
        {
            //1.保存pNode的下一个节点
            pNext= pNode->next;
            //2.如果下一个节点为空的话,当前节点就是新的头节点
            if(pNext == nullptr)
            {
                pNewHead = pNode;
                //不能返回,一返回就断了!!!!
                //return pNewHead;
            }
                
            //3.定义新的下一个节点
            pNode->next = pPrev;
            
            //4.现在前一节点为pPrev
            pPrev = pNode;
            //5.现在当前节点为保存的节点
            pNode =pNext; 
        }
        //为什么一定得写上这个????????如何输出链表所有元素
        return pNewHead;
        
        
        
    }
};

你可能感兴趣的:(24剑指OFFER之反转链表)