2021/04/24
这道题和第24题一样,最好引入一个 sentry 结点,因为链表的 head 结点会被修改掉。
维护 prev 和 head,每次用 prev.next 更新 head,如果 head 为空说明转换结束。
如果元素不足 k 个了,就让 prev 指向最后一个结点。
简单画个草图:
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode sentry = new ListNode(0);
sentry.next = head;
ListNode prev = sentry;
while (head != null) {
prev = reverseK(prev, head, k);
head = prev.next;
}
return sentry.next;
}
public ListNode reverseK(ListNode prev, ListNode head, int k) {
{ // 检查剩下的链表还有没有 k 个元素
int m = 1;
ListNode p = head; // head 保证了一定不是 null
while (p.next != null && m < k) {
p = p.next;
m += 1;
}
if (m < k) return p;
}
prev.next = reverseK(head, k);
return head;
}
private ListNode reverseK(ListNode head, int k) {
ListNode left = null;
ListNode right = head;
int n = 0;
while (n < k) {
ListNode next = right.next;
right.next = left;
left = right;
right = next;
n += 1;
}
head.next = right;
return left;
}
}