import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
public ListNode reverseBetween (ListNode head, int m, int n) {
// write code here
if(m - n == 0) return head;
int i = 1;
ListNode l1 = new ListNode(0),l2 = new ListNode(0);
ListNode p = head;
while(head != null){
//记录开始反转的前一个节点
if(i == m - 1) l1 = head;
if(i == n){
//记录反转结尾的下一个节点
l2 = head.next;
break;
}
head = head.next;
i++;
}
//开头反转,只需要连接反转结尾的节点
if(m == 1){
ListNode n1 = dfs(p,m,n);
ListNode k = n1;
while(n1.next != null){
n1 = n1.next;
}
//连接反转结尾的节点
n1.next= l2;
return k;
}else{
ListNode k = dfs(l1.next,m,n);
//连接开始反转的节点
l1.next = k;
while(k.next != null){
k = k.next;
}
//连接结尾反转的节点
k.next = l2;
}
return p;
}
//反转
public ListNode dfs(ListNode p ,int m,int n){
if(m == n){
return p;
}
ListNode p1 = dfs(p.next,m + 1,n);
p.next.next = p;
p.next = null;
return p1;
}
}