92. Reverse Linked List II(链表局部逆序**)

来源:互联网 发布:果蔬清洗机有用吗 知乎 编辑:程序博客网 时间:2024/05/27 14:13
Reverse a linked list from position m to n. Do it in-place and in one-pass.For example:Given 1->2->3->4->5->NULL, m = 2 and n = 4,return 1->4->3->2->5->NULL.

此问题看似简单,实际很麻烦,如果不使用二级指针,那么如果链表仅有两项,并且要求m=1,n=2,那么我们无从存储prev,还要考虑多种情况。使用二级指针可以简化:

class Solution {public:    ListNode* reverseBetween(ListNode* head, int m, int n) {        if(head == NULL || m == n)            return head;        ListNode** pp = &head;        for(int i=1; i<m; ++i)              pp = &((*pp)->next);        ListNode* end = *pp;        ListNode* prev = NULL;        for(int i=m; i<=n; ++i){            ListNode* cur = (*pp);            (*pp) = (*pp)->next;            cur->next = prev;            prev = cur;        }        end->next = *pp;        *pp = prev;        return head;    }};
0 0