class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = nextdef has_cycle(head): """Detect cycle in linked list""" slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next if slow == fast: return True return Falsedef find_middle(head): """Find middle node (second middle if even length)""" slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next return slow
def reverse_list(head): """Reverse entire linked list""" prev = None current = head while current: next_node = current.next current.next = prev prev = current current = next_node return prevdef reverse_between(head, left, right): """Reverse nodes from position left to right""" dummy = ListNode(0, head) prev = dummy # Move to node before left for _ in range(left - 1): prev = prev.next # Reverse from left to right current = prev.next for _ in range(right - left): next_node = current.next current.next = next_node.next next_node.next = prev.next prev.next = next_node return dummy.next
def remove_nth_from_end(head, n): """Remove nth node from end using two pointers""" dummy = ListNode(0, head) slow = fast = dummy # Move fast n+1 steps ahead for _ in range(n + 1): fast = fast.next # Move both until fast reaches end while fast: slow = slow.next fast = fast.next # Remove nth node slow.next = slow.next.next return dummy.next
A dummy node simplifies edge cases when the head might change:
Copy
def solve(head): dummy = ListNode(0) dummy.next = head # ... operations ... return dummy.next # New head
Reversal Template
Copy
def reverse(head): prev, curr = None, head while curr: next_node = curr.next curr.next = prev prev = curr curr = next_node return prev # New head
Floyd's Cycle Detection
Detect cycle: Fast catches slow = cycle exists
Find start: Reset one to head, move both at same speed
Copy
def find_cycle_start(head): slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next if slow == fast: # Cycle found slow = head while slow != fast: slow = slow.next fast = fast.next return slow # Cycle start return None