思路: 1.先不考虑边界问题 m --> n 步长为 stepInterval, 例如 2 -> 4 步长为 2, 先定义 slow 、fast节点,移动fast节点 ,两者距离 stepInterval步长,然后fast.next = null,反转链表,slow就是尾节点,fast就是头节点了。同时记录下反转前 slow的前一个节点before,和 fast后的一个节点 after 2.考虑边界问题,m = 1 的情况,反转前 slow 是head头节点,直接返回fast节点作为链表新头节点了。 如果刚开始移动stepInterval步长的时候,fast移动到末尾和没有移动到末尾时 fast已经为空的情况
/*
* 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 || head == null ||m >= n){
return head;
}
ListNode slow = head, fast = head;
//将 [slow , fast ]区间反转
ListNode before = null , after = null;
//边界问题处理
//处理
int stepInterval = n - m ;
while(stepInterval > 0){
if(fast == null){
//说明步长不够反转,直接返回
return head;
}
fast = fast.next;
if(fast != null){
//可能刚刚好步长
after = fast.next;
}
stepInterval -- ;
}
int step = m - 1;
while(step > 0){
step --;
before = slow;
slow = slow.next;
fast = fast.next;
if(fast != null){
after = fast.next;
}
}
//反转
fast.next = null;
reverse(slow);
if(before == null){
head = fast;
}else{
before.next = fast;
}
slow.next = after;
return head;
}
private void reverse(ListNode slow){
ListNode pre = null, currentNode = slow;
while(currentNode != null){
ListNode next = currentNode.next;
currentNode.next = pre;
pre = currentNode;
currentNode = next;
}
}
}