【剑指Offer】面试题16:反转链表

来源:互联网 发布:java 文件迁移 编辑:程序博客网 时间:2024/06/09 03:38

 一:题目描述

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

二:解题思路

想反转一个链表,对于每一结点要改变它Pre与nextj结点的方向
 所以我们必须要记住当前节点,它的前一个结点以及后一个结点
 同时要考虑边界情况  头指针为空或者只包含一个结点

三:代码实现

/*struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}};*/class Solution {public:    ListNode* ReverseList(ListNode* pHead) {        //想反转一个链表,对于每一结点要改变它Pre与nextj结点的方向        //所以我们必须要记住当前节点,它的前一个结点以及后一个结点        //同时要考虑边界情况  头指针为空或者只包含一个结点                //边界条件:头结点为空或只包含一个结点,不用反转,直接返回头指针        if(pHead==NULL || pHead!=NULL  && pHead->next==NULL)            return pHead;                //包含多个结点,反转需要记录当前节点,它的前一个结点,它的后一个结点        ListNode* pNode=pHead;  //当前节点        ListNode* pPre=NULL; //初始化当前节点的前一个节点为空        //因为反转后头结点变成节点,头结点的前一个节点变成尾结点的下一个节点,所以设置NULL        ListNode* pReverseHead=NULL; //反转后的头结点初始化为空,最终他等于原始链表的尾结点                while(pNode!=NULL){            //保存当前节点的下一个节点            ListNode* pNext=pNode->next;                        //如果是尾结点,将其赋值给反转后的头指针            if(pNext==NULL)            pReverseHead=pNode;                        //改变指针方向            pNode->next=pPre;            //修改pPRe:当前节点为下一个节点的前节点            pPre=pNode;            //遍历下一个节点            pNode=pNext;        }                return pReverseHead;    }};