题目传送:https://leetcode.cn/problems/reverse-linked-list-ii/
运行效率:

代码如下:
public ListNode reverseBetween(ListNode head, int left, int right) {
// 处理边界情况
if (left == right) {
return head;
}
// 把链表分成3个部分,左 中 右
ListNode cur = head;
ListNode leftTailNode=null; // 左部分的尾节点
ListNode middleHeadNode=null; // 中部分的头结点
ListNode middleTailNode=null; // 中部分的尾节点
ListNode rightHeadNode=null; // 右部分的头结点
int i = 1;
if (left == 1) {
middleHeadNode=head;
} else {
while (i < left - 1) {
cur = cur.next;
i++;
}
leftTailNode = cur;
middleHeadNode = leftTailNode.next;
}
while (i < right) {
cur = cur.next;
i++;
}
middleTailNode = cur;
rightHeadNode = middleTailNode.next; // 右部分的头结点
middleTailNode.next = null; // 下面要翻转链表,所以要把中部分单独截取出来方便进行翻转
// 翻转后的链表
ListNode newMiddleHeadNode = reverseListNode(middleHeadNode);
// 翻转完以后 middleHeadNode变成了翻转结果的尾结点
if(leftTailNode!=null){
leftTailNode.next = newMiddleHeadNode;
middleHeadNode.next = rightHeadNode;
return head;
}else{
middleHeadNode.next = rightHeadNode;
return newMiddleHeadNode;
}
}
/**
* @description // 翻转链表 翻转结束后,head会变成翻转链表后的尾节点
* @return 翻转链表后的头结点
*/
public ListNode reverseListNode(ListNode head) {
// 处理边界情况
if (head == null || head.next == null) {
return head;
}
ListNode next = head.next;
// 翻转链表后的头结点
ListNode listNode = reverseListNode(next);
next.next = head;
head.next = null;
return listNode;
}
















