public static ListNode reverseBetween(ListNode head, int left, int right) {
//找到4个点 1.左结点 2.左结点前一个结点 3.右结点 4.右结点之后的结点
//在头结点之前创建一个结点
ListNode foremost = new ListNode(-1);
foremost.next = head;
//寻找4个点 使用一个辅助结点
ListNode temp = foremost;
for(int i = 1; i <= left - 1; i++) {
temp = temp.next;
}
ListNode pre = temp;//找到左前结点
ListNode leftNode = temp.next;//找到左结点
temp = foremost;
for(int i = 1; i <= right; i++) {
temp = temp.next;
}
ListNode rightNode = temp;//找到右结点
ListNode curr = rightNode.next;//找到右后结点
// 切断链接
pre.next = null;
rightNode.next = null;
// 反转链表的子区间
reverseLinkedList(leftNode);
//回到原来的链表中
pre.next = rightNode;
leftNode.next = curr;
return foremost.next;
}
private static void reverseLinkedList(ListNode head) {
// 也可以使用递归反转一个链表
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
}
思路简单,就是细节不会,边界