if current.value == k: equal.next_node = current equal = equal.next_node elif current.value > k: more.next_node = current more = more.next_node else: less.next_node = current less = less.next_node current = next_node less.next_node = equal_head.next_node equal.next_node = more_head.next_node return less_head.next_node # Tests: a = ListNode.make_list([1, 2, 3, 1, 2, 3, 1, 2, 3]) b = pivot(a, 2) print b.traversal() a = ListNode.make_list([2, 2, 2, 3, 2, 2]) b = pivot(a, 2) print b.traversal() a = ListNode.make_list([1, 1, 1, 1, 1, 2, 1, 1, 1]) b = pivot(a, 2) print b.traversal() a = ListNode.make_list([1]) b = pivot(a, 2) print b.traversal()
return False def length(node): if node is None: return 0 result = 0 current = node while current: current = current.next_node result += 1 return result # Tests: from linked_list import ListNode a = ListNode.make_list(range(15)) b = ListNode.make_list(range(6)) b_end = b.find(5) a_mid = a.find(7) b_end.next_node = a_mid print "True", merges(a, b) a = ListNode.make_list(range(15)) b = ListNode.make_list(range(6)) print "False", merges(a, b) a = ListNode.make_list(range(15)) b = ListNode.make_list(range(6)) b_end = b.find(5) a_mid = a.find(14) b_end.next_node = a_mid
### # Questions: # Length of list # Return type (assume none) def remove_dupes(node): current = node while current: succ = current.next_node while succ and succ.value == current.value: succ = succ.next_node current.next_node = succ current = succ # Tests: from linked_list import ListNode a = ListNode.make_list(range(10)) remove_dupes(a) print a.traversal() a = ListNode.make_list([0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 5, 5, 6, 6]) remove_dupes(a) print a.traversal() # Time: 4 minutes ### # Mistakes / Bugs / Misses ### # Forgot colon on line 14
def cyclic_shift(node, k): # TODO: error checking if k == 0: return # Might as well use the "clever" solution back = node front = node for _ in range(k): front = front.next_node while front.next_node: back = back.next_node front = front.next_node new_head = back.next_node back.next_node = None front.next_node = node return new_head # Tests: from linked_list import ListNode a = ListNode.make_list(range(8)) b = cyclic_shift(a, 3) print b.traversal(), "56701234" # Time: 11 minutes ### # Mistakes / Bugs / Misses ### # screwed up doing the back/front pointers in the first loop # line 28 had front.next_node = new_head, instead of node
even_current = even_current.next_node else: odd_current.next_node = current odd_current = odd_current.next_node on_even = not on_even next_node = current.next_node current.next_node = None current = next_node #current, current.next_node = current.next_node, None odd_head = odd_head.next_node even_head = even_head.next_node even_current.next_node = odd_head return even_head # Tests: a = ListNode.make_list(range(12)) result = even_odd(a) print result.traversal() a = ListNode.make_list(range(1)) result = even_odd(a) print result.traversal() # Time: 11 minutes ### # Mistakes / Bugs / Misses ### # Forgot lines 35 and 42 # Line 39 doesn't work for a reason I don't understand. (TODO: Card) # Probably something about the assignment order?
### # Problem ### # Delete a node in a singly-linked list in O(1) time. You may modify # the value field, and the node is not the last one in the list. ### # Work ### def delete_node(node): node.value = node.next_node.value node.next_node = node.next_node.next_node # Tests from linked_list import ListNode a = ListNode.make_list(range(10)) node = a.find(6) delete_node(node) print a.traversal(), "6 deleted" # Time: 2 minutes ### # Mistakes / Bugs / Misses ###
def reverse(head): prev = None current = head while current: next_node = current.next_node current.next_node = prev prev = current current = next_node return prev # Tests: from linked_list import ListNode a = ListNode.make_list([1, 2, 3, 4, 3, 2, 1]) print palindromic(a), "True" print a.traversal() a = ListNode.make_list([1, 2, 3, 3, 2, 1]) print palindromic(a), "True" print a.traversal() a = ListNode.make_list([1, 2, 3, 4, 2, 1]) print palindromic(a), "False" print a.traversal() a = ListNode.make_list([1]) print palindromic(a), "True" print a.traversal()
while a or b or carry: a_digit = a.value if a else 0 b_digit = b.value if b else 0 a = a.next_node if a else None b = b.next_node if b else None digit_sum = a_digit + b_digit + carry new_digit = digit_sum % 10 carry = digit_sum / 10 result.next_node = ListNode(new_digit) result = result.next_node return result_head.next_node # Tests: a = ListNode.make_list([3, 1, 4]) b = ListNode.make_list([7, 0, 9]) result = add(a, b) print result.traversal(), [0, 2, 3, 1] a = ListNode.make_list([9, 9, 9, 9, 9, 9, 9]) b = ListNode.make_list([1]) result = add(a, b) print result.traversal(), [0, 0, 0, 0, 0, 0, 0, 1] b = ListNode.make_list([9, 9, 9, 9, 9, 9, 9]) a = ListNode.make_list([1]) result = add(a, b) print result.traversal(), [0, 0, 0, 0, 0, 0, 0, 1] b = ListNode.make_list([0])
def reverse(node): current = node previous = None while current: next_node = current.next_node current.next_node = previous previous = current current = next_node return (previous, node) # Test from linked_list import ListNode a = ListNode.make_list([1, 2, 3, 4, 5]) result = reverse_sublist(a, 2, 4) print result.traversal(), 14325 a = ListNode.make_list([1, 2, 3, 4, 5]) result = reverse_sublist(a, 2, 5) print result.traversal(), 15432 a = ListNode.make_list([1, 2, 3, 4, 5]) result = reverse_sublist(a, 1, 5) print result.traversal(), 54321 # Time: 17 minutes ### # Mistakes / Bugs / Misses
while True: slow = slow.next_node fast = fast.next_node if fast: fast = fast.next_node if not fast: return None if slow == fast: break fast = head while fast != slow: slow = slow.next_node fast = fast.next_node return fast # Test: from linked_list import ListNode ll = ListNode.make_list([1, 2, 3, 4, 5, 6, 7, 8]) start = ll.find(3) end = ll.find(8) end.next_node = start result = cycle_test(ll) print result == start, result, start ll = ListNode.make_list(range(15)) start = ll.find(6) end = ll.find(14) end.next_node = start result = cycle_test(ll) print result == start, result, start ll = ListNode.make_list(range(15)) result = cycle_test(ll)