class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
this.next = null;
}
public ListNode(){}
}
/**
* @description 反转指定位置的节点 [1,2,3,4,5],start=2, end=4 -> [1,4,3,2,5]
* @author HelloWorld
* @create 2022/10/30 16:15
* @param head
* @param left
* @param right
* @return com.wy.leetcode.linkedlist.ListNode
*/
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode cur = new ListNode();
cur.next = head;
// 1.先找到开始反转定节点; 让temp指向要开始反转定节点, cur.next = temp;
ListNode pre = cur;
for (int i = 1; i < left; i++) {
pre = pre.next;
}
head = pre.next;
// 2.反转
// 反转后的头节点
ListNode reversedHead = new ListNode();
// 反转后的头节点的尾节点
ListNode reversedTail = new ListNode();
for (int i = left; i <= right ; i++) {
ListNode temp = new ListNode(head.val);
if (i == left) {
reversedTail = temp;
}
temp.next = reversedHead;
reversedHead = temp;
head = head.next;
}
// 3.组装
pre.next = reversedHead;
reversedTail.next = head;
return cur.next;
}