题解 | #链表内指定区间反转#
链表内指定区间反转
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) {
// write code here
/* 边缘情况
1. 空表
2. 范围不合法, 不过好像题目中已经告诉了范围一定合法,所以不需要进行处理
*/
if (head == null) return null;
/*
直接将 head 分成三部分
注意 leftList 和 rightList 可能为空
midList 必不为空
*/
ListNode leftList = null;
ListNode tailLeftList = null;
ListNode midList = null;
ListNode tailMidList = null;
ListNode rightList = null;
ListNode ptrCurHead = head;
ListNode ptrNextHead = null;
int index = 1;
// 左侧有节点
if (m > 1) leftList = head;
// n 之后的都是rightList的部分
while (index <= n) {
ptrNextHead = ptrCurHead.next;
if (index < m) { // 记录leftList的尾结点
tailLeftList = ptrCurHead;
} else { // midList
if (index == m) { // 记录midList的尾结点
tailMidList = ptrCurHead;
}
ptrCurHead.next = midList;
midList = ptrCurHead;
}
ptrCurHead = ptrNextHead;
index++;
}
rightList = ptrCurHead;
ListNode list = null;
// 拼接字符串 leftList(mayble null) + midList(must have node) + rightList(maybe null)
if (leftList != null) {
list = leftList;
tailLeftList.next = midList;
} else {
list = midList;
}
if (rightList != null) {
tailMidList.next = rightList;
} else {
tailMidList.next = null;
}
return list;
}
}
查看14道真题和解析