举一反三,比翻转链表多的操作只是:接上前驱和后置节点
//区间反转
public static ListNode reverseBetween (ListNode head, int m, int n) {
//临界值
if(head==null) return null;
ListNode dum = new ListNode(0);
dum.next = head;
ListNode prev = dum;//定义虚拟节点dum,方便定义前驱节点prev
ListNode start = head;//M指针
ListNode end = head;//N指针
for(int i=1;i<m;i++){//移动M和前驱指针
if(start!=null) {
start = start.next;
prev = prev.next;
}else return head;//没有达到有效区间则结束程序
}
for(int i = 1;i<n;i++){//移动N指针
if(end!=null) end = end.next;
else return head;//没有达到有效区间则结束程序
}
//如果区间为当前节点,则不用反转
if(end!=head) prev.next = func(start,end);//执行反转,并接上前驱节点
return dum.next;//返回头节点
}
//区间反转(同反转链表操作)
public static ListNode func(ListNode start, ListNode end){
ListNode dum = end.next;//指向N节点
ListNode cur = start;
while(dum!=end){
ListNode next = cur.next;
cur.next = dum;
dum = cur;
cur = next;
}
return end;
}