def reverse_k(head, k):
pointers = []
it = head
for _ in range(k):
if it is None: return head
pointers.append(it)
it = it.next
last = reverse_k(pointers[-1].next, k)
for p1, p2 in zip(pointers, [last] + pointers):
p1.next = p2
return pointers[-1]