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
}
};