// 从前往后遍历, 保留left前一个节点pre位置, 保留right后一个节点的位置q
// 同时保留lef所在的位置rTail, 保留right所在位置p
// 翻转left到right的链表
// 把p接到pre后面,把q接到rTail后面
// 特判pre是否为null, 此时head可能是q的位置
// 细节特别多
// 完事儿
class Solution {
public int n;
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode p = head;
left --;
right --;
int i = 0;
ListNode pre = null;
while(i < left) {
pre = p;
p = p.next;
i++;
}
ListNode rTail = p;
ListNode q = null;
if (p != null)
q = p.next;
ListNode temp = null;
for (; i < right; i++) {
temp = q.next;
q.next = p;
p = q;
q = temp;
}
rTail.next = q;
if (pre != null)
pre.next = p;
else
head = p;
return head;
}
}
|