Reverse entire list or sublists in-place without extra arrays
Iteratively reverse pointers, carefully managing previous/current/next and reconnecting borders.
Use for full reversal, sublist [m,n] reversal, and reversing nodes in k-groups.
Classic iterative reversal
def reverse_list(head):
prev, cur = None, head
while cur:
nxt = cur.next
cur.next = prev
prev, cur = cur, nxt
return prev
Reverse nodes between m and n
def reverse_between(head, m, n):
if m == n: return head
dummy = ListNode(0, head)
prev = dummy
for _ in range(m-1): prev = prev.next
cur = prev.next
for _ in range(n-m):
nxt = cur.next
cur.next = nxt.next
nxt.next = prev.next
prev.next = nxt
return dummy.next
Reverse nodes in groups of k
def reverse_k_group(head, k):
dummy = ListNode(0, head)
group_prev = dummy
while True:
kth = group_prev
for _ in range(k):
kth = kth.next
if not kth: return dummy.next
group_next = kth.next
# reverse group
prev, cur = group_next, group_prev.next
for _ in range(k):
nxt = cur.next
cur.next = prev
prev, cur = cur, nxt
tmp = group_prev.next
group_prev.next = kth
group_prev = tmp
def template(*args, **kwargs):
# General template placeholder
pass
Each link reversed once.
Constant pointers.