剑指offer 编程题(14):链表倒序

来源:互联网 发布:在淘宝买护肤品靠谱吗 编辑:程序博客网 时间:2024/06/06 07:16

题目描述

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

三个指针 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;    }};
//第二种方法是:递归方法 /*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;    }};
原创粉丝点击