Сложность: hard
Учитывая заголовок связанного списка, поменяйте местами узлы списка по
k за раз и верните изменённый список. Если количество узлов не кратно
k, то последние остаются без изменений. *Изменять можно только связи между узлами, а не их значения.*
Пример:
Input: head = [1,2,3,4,5], k = 2 Output: [2,1,4,3,5]
👨💻 Алгоритм:
1⃣Создать фиктивный узел
dummy, указывающий на head, и использовать указатель pointer для прохода по списку.2⃣В каждом шаге проверять, есть ли впереди
k узлов — если нет, завершить процесс. Иначе — развернуть группу из k узлов.3⃣После разворота связать конец текущей группы с началом следующей и перейти к следующей группе, сдвинув
pointer.😎 Решение:
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode pointer = dummy;
while (pointer != null) {
ListNode node = pointer;
for (int i = 0; i < k && node != null; i++) node = node.next;
if (node == null) break;
ListNode prev = null, curr = pointer.next;
for (int i = 0; i < k; i++) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
ListNode tail = pointer.next;
tail.next = curr;
pointer.next = prev;
pointer = tail;
}
return dummy.next;
}Ставь 👍 и забирай 📚 Базу знаний