Сложность: hard
Учитывая заголовок связанного списка, поменяйте местами узлы списка k за раз и верните измененный список.
k — целое положительное число, меньшее или равное длине связанного списка. Если количество узлов не кратно k, то пропущенные узлы в конечном итоге должны остаться такими, какие они есть.
Вы не можете изменять значения в узлах списка, можно изменять только сами узлы.
Пример:
Input: head = [1,2,3,4,5], k = 3
Output: [3,2,1,4,5]
👨💻 Алгоритм:
1⃣ Проверяем, хватает ли элементов в текущей группе (не менее k узлов).
2⃣ Если хватает, переворачиваем узлы в группе, используя указатели.
3⃣ Рекурсивно вызываем
reverseKGroup для следующей группы и соединяем с уже перевернутыми узлами. 😎 Решение:
class Solution {
fun reverseKGroup(head: ListNode?, k: Int): ListNode? {
var count = 0
var cur = head
while (count < k && cur != null) {
cur = cur.next
count++
}
if (count < k) return head
var prev: ListNode? = null
cur = head
repeat(k) {
val next = cur?.next
cur?.next = prev
prev = cur
cur = next
}
head?.next = reverseKGroup(cur, k)
return prev
}
}Ставь 👍 и забирай 📚 Базу знаний