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.
Iterative pointer flipping; use a dummy head and head-insertion to reverse a sublist [m,n] and reconnect borders correctly.
# In-place Reversal Templates
def reverse_list(head):
prev, cur = None, head
while cur:
nxt = cur.next
cur.next = prev
prev, cur = cur, nxt
return prev
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.nextClassic iterative reversal
def reverse_list(head):
prev, cur = None, head
while cur:
nxt = cur.next
cur.next = prev
prev, cur = cur, nxt
return prevReverse 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.nextReverse 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 = tmpEach link reversed once.
Constant pointers.