Tag:List
Difficulty:Medium
Problem
给你单链表的头指针 head 和两个整数left 和 right ,其中left <= right 。
请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
Solution
和一般的链表转置的区别是加了指定位置,因此用一个count判断是否在指定区间内。
public ListNode reverseBetween(ListNode head, int left, int right) {
if (head == null || head.next == null || left == right) {
return head;
}
ListNode res = new ListNode(-1); // left可能为1
res.next = head;
ListNode pre = res, cur = res.next;
int count = 1;
while (count != left) {
count++;
pre = cur;
cur = cur.next;
}
ListNode p = cur.next;
// 交换
while (count != right && p != null ) {
// 在pre和cur之间插入 cur.next 如果是最后一个呢
count++;
ListNode q = p.next;
p.next = pre.next;
pre.next = p;
p = q;
}
cur.next = p;
return res.next;
}