92. Reverse Linked List II

来源:互联网 发布:淘宝总公司投诉电话 编辑:程序博客网 时间:2024/05/01 14:37

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode *reverseBetween(ListNode *head, int m, int n) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        if (head == NULL)            return NULL;                    ListNode *q = NULL;        ListNode *p = head;        for(int i = 0; i < m - 1; i++)        {            q = p;            p = p->next;        }                ListNode *end = p;        ListNode *pPre = p;        p = p->next;        for(int i = m + 1; i <= n; i++)        {            ListNode *pNext = p->next;                        p->next = pPre;            pPre = p;            p = pNext;        }                end->next = p;        if (q)            q->next = pPre;        else            head = pPre;                return head;    }};



对这种链表题还是比较混啊。。。。多看看

参考http://www.cnblogs.com/remlostime/archive/2012/11/18/2776273.html


简单的思路:

首先根据m和n找到第m个结点以及它之前的结点mp,第n个结点以及它之后的结点nn。

然后将这之间的链表反转,再跟原来的mp和nn接上。

使用dummy头结点,简化代码书写。

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode *reverseBetween(ListNode *head, int m, int n) {        if(!head)            return head;        ListNode *dummy = new ListNode(INT_MAX);        dummy->next = head;        ListNode *start = head;        ListNode *startPre = dummy;        ListNode *end = head;        ListNode *endNext = NULL;        for(int i = 1;i<m;++i)        {            if(i == m-1)                startPre = start;            start = start->next;        }        for(int i = 1;i<n;++i)        {            end = end->next;        }        endNext = end->next;                ListNode* prev = startPre;        ListNode* cur = start;        ListNode* next = cur->next;                while(cur != endNext)        {            cur->next = prev;            prev = cur;            cur = next;            if(next)            next = next->next;        }                startPre->next = end;        start->next = endNext;                return dummy->next;            }};


0 0
原创粉丝点击