import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
public ListNode reverseBetween (ListNode head, int m, int n) {
/**
* 遍历区间内的节点,每次放在pre的后面
*
*/
ListNode headPre = new ListNode(-1);
headPre.next = head;
//把链表分为 头部 尾部 待翻转的部分
ListNode first=headPre;
ListNode reverse;
ListNode reverse2=null;
ListNode last;
for(int i =0; i<m-1;i++){
first=first.next;
}
// 这个时候头已经选出来了
reverse=first.next;
reverse2=reverse;
if(m!=1){
first.next=null;
first=headPre.next;
}
for(int i =0; i<n-m;i++){
reverse2=reverse2.next;
}
last=reverse2.next;
reverse2.next=null;
reverse2=reverse;
ListNode newHead=reverseList(reverse);
if(m!=1){
ListNode temp=first;
while(temp.next!=null){
temp=temp.next;
}
temp.next=newHead;
}else{
first=newHead;
}
while(newHead.next!=null){
newHead=newHead.next;
}
newHead.next=last;
return first;
}
public ListNode reverseList (ListNode head) {
ListNode pre=null;
while(head!=null){
ListNode next=head.next;
head.next=pre;
pre=head;
head=next;
}
return pre;
}
}