Exemple #1
0
    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()
Exemple #2
0
    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
Exemple #3
0
###
# 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
Exemple #4
0
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

Exemple #5
0
      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?
Exemple #6
0
###
# 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
###
Exemple #7
0
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()
Exemple #8
0
    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])
Exemple #9
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
Exemple #10
0
    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)