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