ps1-solutions.pdf
Stirling’s approximation

Problem 1-3. [20 points] Binder Bookmarks
这个问题有意思
Problem 1-4. [44 points] Doubly Linked List
class Doubly_Linked_List_Node:
def __init__(self, x):
self.item = x
self.prev = None
self.next = None
def later_node(self, i):
if i == 0: return self
assert self.next
return self.next.later_node(i - 1)
class Doubly_Linked_List_Seq:
def __init__(self):
self.head = None
self.tail = None
def __iter__(self):
node = self.head
while node:
yield node.item
node = node.next
def __str__(self):
return '-'.join([('(%s)' % x) for x in self])
def build(self, X):
for a in X:
self.insert_last(a)
def get_at(self, i):
node = self.head.later_node(i)
return node.item
def set_at(self, i, x):
node = self.head.later_node(i)
node.item = x
def insert_first(self, x):
###########################
# Part (a): Implement me! #
###########################
item = Doubly_Linked_List_Node(x)
if self.head is None:
self.head = item
self.tail = item
else:
item.next = self.head
self.head.prev = item
self.head = item
def insert_last(self, x):
###########################
# Part (a): Implement me! #
###########################
item = Doubly_Linked_List_Node(x)
if self.tail is None:
self.head = item
self.tail = item
else:
item.prev = self.tail
self.tail.next = item
self.tail = item
def delete_first(self):
assert self.head
x = self.head.item
###########################
# Part (a): Implement me! #
###########################
self.head = self.head.next
if self.head is None:
self.tail = None
else:
self.head.prev = None
return x
def delete_last(self):
assert self.tail
x = self.tail.item
###########################
# Part (a): Implement me! #
###########################
self.tail = self.tail.prev
if self.tail is None:
self.head = None
else:
self.tail.next = None
return x
def remove(self, x1, x2):
L2 = Doubly_Linked_List_Seq()
###########################
# Part (b): Implement me! #
###########################
L2.head = x1
L2.tail = x2
if x1 == self.head:
self.head = x2.next
else:
x1.prev.next = x2.next
if x2 == self.tail:
self.tail == x1.prev
else:
x2.next.prev = x1.prev
x1.prev = None
x2.next = None
return L2
def splice(self, x, L2):
###########################
# Part (c): Implement me! #
###########################
xn = x.next
x1 = L2.head
x2 = L2.tail
L2.tail = None
L2.head = None
x1.prev = x
x.next = x1
x2.next = xn
if xn is None:
self.tail = x2
else:
xn.prev = x2