题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
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) {
// 判断是否进行区间反转
if(m == n){
return head;
}
// 记录第一个点,用作return
ListNode headNode = head;
// 记录链表第几个结点
int count = 1;
// 记录反转区间前的第一个点,用作后面赋值
ListNode beforeNode = null;
// 记录反转区间内的第一个点,用作后面赋值
ListNode fristNode = null;
// 定义反转区间需要的前后点
ListNode preNode = null;
ListNode nextNode = null;
// 首先到达反转区间
while(count < m){
// 记录反转区间前的第一个点
beforeNode = head;
head = head.next;
count++;
}
// 记录转区间内的第一个点
fristNode = head;
// 到达反转区间,进行反转
while(count <= n){
nextNode = head.next;
head.next = preNode;
preNode = head;
head = nextNode;
count++;
}
// 设置反转区间前一个点的next为反转区间内的最后一位
// 做一个判断:如果是第一个点可能导致beforeNode为空,null的val无法赋值导致错误
if(beforeNode != null){
beforeNode.next = preNode;
}
// 设置反转区间内的第一个点的next为反转区间的后一个点
fristNode.next = head;
// 简单判断
if(m == 1){
return preNode;
}
return headNode;
}
}

