Reverse Linklist between

逆置链表升级版,选择部分reverse,首先分析m n的情况,1<=m<=n<=len, 特殊的就是head==NULL 或者 m>n 或者 m<=n 但是 m<1 这几种了,不过后面题目说了 m n满足这些条件,我没有仔细审题

m=n 直接返回,避免处理特殊出错

后面reverse 主要是把reverse后的 和前(可能没有)后(可能没有)链接起来,分析之后发现后面空的可以统一起来,
但是前面空的不行,因为OldHeadPrev没有被赋值,所以后面访问其next有bug,所以单独处理下m=1的情况,用OldHeadPrev初值NULL
是否改变来表示,也可以直接用m=1标示,里面就是普通情况OldHead->next=p 写成NULL了,可能当时分析了后面为空的,然后一下子写了特殊情况的一个赋值了。

/**
 * 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==NULL||m>n||m<1) return NULL;
        //find m node
        if(m==n) return head;


        int i=1;
        ListNode* p=head,*OldHeadPrev=NULL,*OldHead;
        while(i<m)
            OldHeadPrev=p,p=p->next,i++;
        OldHead=p;

        ListNode* prev=NULL,*pnext;//
        while(i<=n)
        {
            pnext=p->next;
            p->next=prev;
            prev=p;
            p=pnext;
            i++;
        }
        if(OldHeadPrev!=NULL)
            OldHeadPrev->next=prev,OldHead->next=p;
        else//m==1,OldHeadPrev not assigned
            head=prev,OldHead->next=p;
        return head;

        //record m, for next to n+1, record m-1, for next to n
        //reverse linked list entil n



    }
};

Posted by richard爱闹 - 7月 24 2014
如需转载,请注明: 本文来自 Richard