Skip to main content

Three Pointers

206. Reverse Linked List

Interactive Visualization

def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
"""Abdul Bari's solution"""
front, mid, back = head, None, None
while front:
front, mid, back = front.next, front, mid
mid.next = back
return mid

Reverse a Doubly Linked List

def reverseDLL(self, head):
front, mid, back = head, None, None
while front:
front, mid, back = front.next, front, mid
mid.next = back
mid.prev = front
return mid

Reverse both parts

def reverse(self, head: Optional["Node"], k: int) -> Optional["Node"]:
sep = tail = new_head = None
index = 0
front, mid, back = head, None, None
while front:
if not front.next:
tail = front
if index == k - 1:
new_head = front
if index == k:
sep = front
front, mid, back = front.next, front, mid
mid.next = back
index += 1

head.next = tail
sep.next = None
return new_head

24. Swap Nodes in Pairs

Interactive Visualization

def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head or not head.next:
return head
sentinel = ListNode(None, next=head)
front, mid, back = head.next, head, sentinel
while front:
mid.next = front.next
front.next = mid
back.next = front

back = mid
mid = mid.next
front = mid.next if mid else None
return sentinel.next

Add 1 to a Linked List Number

class Solution:
def addOne(self, head):
def reverseList(head):
front, mid, back = head, None, None
while front:
front, mid, back = front.next, front, mid
mid.next = back
return mid

new_head = reverseList(head)
carry = 1
curr, prev = new_head, None
while curr:
carry, curr.data = divmod(curr.data + carry, 10)
curr, prev = curr.next, curr
if carry:
prev.next = Node(carry)
return reverseList(new_head)