题解 | #【冲刺双百】链表内指定区间反转#
链表内指定区间反转
http://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
按照指定区间反转列表
反转方法不再赘述,参考:BM1反转链表
考虑多种情况
1.对链表内部反转
最后结果中整个链表头结点没有改变,记录反转区间在原链表中的前置结点beg和后继结点end
此时beg.next为待反转的链表区间头结点,反转后令:
beg.next.next=nex;
beg.next=now
此时返回beg即可。
2.对链表后半部分反转
即n=链表长度:同1
3.对链表前一部分反转
即m=1:最后结果中整个链表头结点改变了,则反转后:
beg.next=now;
此时返回now即可。
public class Solution {
public ListNode reverseBetween (ListNode head, int m, int n) {
//如果为空或m=n则直接返回head
if(head.next==null||m==n) return head;
int temp=m;//记录m的值,后续判断是否为第3种情况
ListNode res=head;//记录原始链表头结点
ListNode beg=head;//待反转链表头结点的前置结点
while(--m>0){//寻找开始反转的位置
beg=head;
head=head.next;
n-=1;
}
ListNode nex=head.next;
ListNode las;
while(--n>0){//反转
las=head;
head=nex;
nex=head.next;
head.next=las;
}
if(temp==1){//如果起始点为头结点,则最终结果头结点为原反转链表最后一个结点
beg.next=nex;
return head;
}
else{//如果起始点不是头结点,则最终结果头结点为原始头结点
beg.next.next=nex;
beg.next=head;
return res;
}
}
}