原题网址:https://leetcode.cn/problems/reverse-linked-list-ii/
给一个链表,翻转一个区间内的节点。
找到左区间的前一个节点,然后开始删除节点,直到出了区间;最后拼接翻转的链表和剩下的链表;
public ListNode reverseBetween(ListNode head, int left, int right) {
if(head == null || head.next == null || left == right) {
return head;
}
// 如果left是第一个数据,无法找到它的前一个,所以引用虚拟节点
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
// 通过找前一个节点,删除left节点
ListNode prev = null;
ListNode first = null;
ListNode tail = null;
ListNode cur = dummyHead;
for(int i=0;i<right;i++) {
// 找到left的前一个节点了,开始删除。
if(i>=left-1) {
prev = cur;
ListNode node = prev.next;
prev.next = node.next;
if(first == null) {
first = tail = node;
} else {
node.next = first;
first = node;
}
} else {
cur = cur.next;
}
}
tail.next = prev.next;
prev.next = first;
return dummyHead.next;
}