class Deque: def __init__(self, items=None): """ initializes a Deque with items if any are given. If items are given they are populated into Deque with push_front method (loading in front by default) """ # initialize linked list for our deque to use self.list = DoublyLinkedList() # build are deque if items is not None: for item in items: self.push_front(item) def push_front(item): """ Takes in given item and prepends it to the front of the deque """ # use linked list prepend method self.list.prepend(item) def push_back(item): """ Takes an item as parameter and appends it to the back of the deque """ # uses linked list append method self.list.append(item) def pop_front(): """ Removes the item at front of deque and returns it """ # grab item to be popped/returned popped_item = self.list.head # remove from left side of list using linkedlist delete method # note: this is still constant b/c popped_item is first item in linkedlist self.list.delete(popped_item) return popped_item # returning item that was just deleted def pop_back(): """ Removes the item at the end of deque and returns its value """ # grab item to be removed (tail of linked list) popped_item = self.list.tail # remove item from right side # currently O(n) self.list.delete(popped_item) return popped_item # return value of deleted item
def test_length_after_delete(self): dll = DoublyLinkedList(['A', 'B', 'C', 'D', 'E']) assert dll.length() == 5 # Delete should decrease length dll.delete('A') assert dll.length() == 4 dll.delete('E') assert dll.length() == 3 dll.delete('C') assert dll.length() == 2 dll.delete('D') assert dll.length() == 1 dll.delete('B') assert dll.length() == 0
def test_delete(self): dll = DoublyLinkedList() dll.append('L') dll.append('K') dll.append('G') dll.delete('L') assert dll.head.data == 'K' assert dll.tail.data == 'G' assert dll.length() == 2 print(dll) dll.delete('K') assert dll.head.data == 'G' assert dll.tail.data == 'G' assert dll.length() == 1
class LinkedQueue(object): def __init__(self, iterable=None): """Initialize this queue and enqueue the given items, if any""" # Initialize a new linked list to store the items self.list = DoublyLinkedList() if iterable: for item in iterable: self.enqueue(item) def __repr__(self): """Return a string representation of this queue""" return 'Queue({} items, front={})'.format(self.length(), self.front()) def is_empty(self): """Return True if this queue is empty, or False otherwise""" # TODO: Check if empty return self.list.size is 0 def length(self): """Return the number of items in this queue""" # TODO: Count number of items return self.list.size def enqueue(self, item): """Insert the given item at the back of this queue""" # TODO: Insert given item self.list.append(item) def front(self): """Return the item at the front of this queue without removing it, or None if this queue is empty""" # TODO: Return front item, if any if self.is_empty(): return None return self.list.head.data def dequeue(self): """Remove and return the item at the front of this queue, or raise ValueError if this queue is empty""" # TODO: Remove and return front item, if any if self.is_empty(): raise ValueError('Queue is empty') item = self.list.head.data self.list.delete(item) return item
def test_delete_with_5_items(self): dll = DoublyLinkedList(['A', 'B', 'C', 'D', 'E']) assert dll.head.data == 'A' # First item assert dll.tail.data == 'E' # Last item dll.delete('A') assert dll.head.data == 'B' # New head assert dll.tail.data == 'E' # Unchanged dll.delete('E') assert dll.head.data == 'B' # Unchanged assert dll.tail.data == 'D' # New tail dll.delete('C') assert dll.head.data == 'B' # Unchanged assert dll.tail.data == 'D' # Unchanged dll.delete('D') assert dll.head.data == 'B' # Unchanged assert dll.tail.data == 'B' # New tail dll.delete('B') assert dll.head is None # No head assert dll.tail is None # No tail
def test_delete(self): ll = DoublyLinkedList(['A', 'B', 'C']) ll.delete('A') assert ll.head.data == 'B' # new head assert ll.tail.data == 'C' # unchanged assert ll.size == 2 ll.delete('C') assert ll.head.data == 'B' # unchanged assert ll.tail.data == 'B' # new tail assert ll.size == 1 ll.delete('B') assert ll.head is None # new head assert ll.tail is None # new head assert ll.size == 0 with self.assertRaises(ValueError): ll.delete('X') # item not in list
def test_delete(self): ll = DoublyLinkedList() ll.append('A') ll.append('B') ll.append('C') ll.delete('A') assert ll.head.data == 'B' assert ll.tail.data == 'C' ll.delete('C') assert ll.head.data == 'B' assert ll.tail.data == 'B' ll.delete('B') assert ll.head is None assert ll.tail is None with self.assertRaises(ValueError): ll.delete('D')
def test_delete(self): dll = DoublyLinkedList() dll.append('A') dll.append('B') dll.append('C') dll.delete('A') assert dll.head.data == 'B' assert dll.tail.data == 'C' assert dll.size == 2 dll.delete('C') assert dll.head.data == 'B' assert dll.tail.data == 'B' assert dll.size == 1 dll.delete('B') assert dll.head is None assert dll.tail is None assert dll.size == 0 with self.assertRaises(ValueError): dll.delete('D')
def DISABLE_test_delete(self): ll = DoublyLinkedList() ll.append('A') ll.append('B') ll.append('C') ll.delete('A') assert ll.head.data == 'B' assert ll.tail.data == 'C' assert ll.size == 2 ll.delete('C') assert ll.head.data == 'B' assert ll.tail.data == 'B' assert ll.size == 1 ll.delete('B') assert ll.head is None assert ll.tail is None assert ll.size == 0 with self.assertRaises(ValueError): ll.delete('D')
def test_size(self): ll = DoublyLinkedList() assert ll.size == 0 # append and prepend operations increment size ll.append('B') assert ll.size == 1 ll.prepend('A') assert ll.size == 2 ll.append('C') assert ll.size == 3 # delete operations decrement size ll.delete('B') assert ll.size == 2 ll.delete('C') assert ll.size == 1 ll.delete('A') assert ll.size == 0
def test_length(self): ll = DoublyLinkedList() assert ll.length() == 0 # append and prepend operations increase length ll.append('B') assert ll.length() == 1 ll.prepend('A') assert ll.length() == 2 ll.append('C') assert ll.length() == 3 # delete operations decrease length ll.delete('B') assert ll.length() == 2 ll.delete('C') assert ll.length() == 1 ll.delete('A') assert ll.length() == 0
dll.insert(1) assert dll.search(1) == True dll.insert(2) dll.insert(3) assert dll.head.next.data == 2 assert dll.search(3) == True assert dll.search(4) == False print "Test 3 Passed" # Test 4 dll = DoublyLinkedList() assert dll.size() == 0 dll.insert(1) dll.insert(2) dll.insert(3) dll.delete(2) assert dll.tail.prev.data == 3 assert dll.search(2) == False assert dll.search(3) == True assert dll.size() == 2 print "Test 4 Passed" # Test 5 dll = DoublyLinkedList() dll.insert(1) dll.insert(2) dll.insert(3) dll.insert(4) dll.print_list_forward() # Test 6
def test_delete_with_item_not_in_list(self): dll = DoublyLinkedList(['A', 'B', 'C']) # Delete should raise error if item not found with self.assertRaises(ValueError): dll.delete('X') # Item not found in list
def test_delete_with_3_items(self): dll = DoublyLinkedList(['A', 'B', 'C']) assert dll.head.data == 'A' # First item assert dll.tail.data == 'C' # Last item dll.delete('A') assert dll.head.data == 'B' # New head assert dll.tail.data == 'C' # Unchanged dll.delete('C') assert dll.head.data == 'B' # Unchanged assert dll.tail.data == 'B' # New tail dll.delete('B') assert dll.head is None # No head assert dll.tail is None # No tail # Delete should raise error if item was already deleted with self.assertRaises(ValueError): dll.delete('A') # Item no longer in list with self.assertRaises(ValueError): dll.delete('B') # Item no longer in list with self.assertRaises(ValueError): dll.delete('C') # Item no longer in list