# NodeModule.py #!/usr/bin/python """ A model containing Node class """ __author__ = "Lin Chen" __version__ = "0.1" class Node: """Single node with double pointers pointing to its previous node and the node after it""" def __init__(self, data): """Initialize a Node Args: data : data saved in the node """ self._data = data self._prev = None self._next = None @property def data(self): return self._data @data.setter def data(self, d): self._data = d @data.deleter def data(self): del self._data @property def next(self): return self._next @next.setter def next(self, n): self._next = n @next.deleter def next(self): del self._next @property def prev(self): return self._prev @prev.setter def prev(self, n): self._prev = n @prev.deleter def prev(self): del self._prev def __str__(self): return str(self._data)
# ListModule.py #!/usr/bin/python """ A modeule containing List class""" from NodeModule import Node class List: """Linked List class with a pre-defined Node class""" def __init__(self): """Initialize a List """ self._head = None self._tail = None self._count = 0 def getSize(self): """Return the size of the list Returns: int : size of the list """ return self._count def insert(self, index, v): """Insert a valude to make the list maintain ascending order Args: v : data which can be saved in a node Returns: boolean: True, if the value is inserted succefully; False, otherwise """ if index < 0 or index > self._count: return False n = Node(v) # create a node # insert a node into an empty list if self.getSize() == 0: self._head = n self._tail = n self._count += 1 return True # insert a node in the front if index == 0: n.next = self._head self._head.prev = n self._head = n self._count += 1 return True # insert a node at the end if index == self.getSize(): n.prev = self._tail self._tail.next = n self._tail = n self._count += 1 return True # insert in the first half if index <= self.getSize()/2: current = self._head for i in range(index-1): current = current.next n.next = current.next n.prev = current current.next.prev = n current.next = n self._count += 1 return True # insert a node in the second half else: current = self._tail for i in range(self.getSize()-index-1): current = current.prev n.next = current n.prev = current.prev current.prev.next = n current.prev = n self._count += 1 return True return False def delete(self, index): """Delete a valude located at a specific location in the list Args: index (int): location of deletion, 0 is the location before the first element, 1 is the location after the first element Returns: boolean: True, if the value is deleted succefully; False, otherwise """ if index < 0 or index > self._count-1: return False # delete the first node if index == 0: self._head = self._head.next self._head.prev = None self._count -= 1 return True # delete the last node if index == self._count-1: self._tail = self._tail.prev self._tail.next = None self._count -= 1 return True # delete a node located in the first half if index <= self._count/2: current = self._head for i in range(index-1): current = current.next current.next = current.next.next current.next.prev = current self._count -= 1 return True # delete a node located in the second half else: current = self._tail for i in range(self.getSize()-index-2): current = current.prev current.prev = current.prev.prev current.prev.next = current self._count -= 1 return True return False def __str__(self): """Convert the list to a string Returns: string : a string represents the list """ if self.getSize() == 0: return "Empty" current = self._head output = [] while current is not None: output.append(str(current)) current = current.next return " -> ".join(output)
# Test.py #!/usr/bin/python from ListModule import List def main(): l = List() l.insert(0, 20) # insert the first node l.insert(1, 10) # insert to the end l.insert(0, 40) # insert to the front l.insert(2, 30) # insert to the second half l.insert(2, 50) # insert to the first half print(l) # 40 -> 20 -> 50 -> 30 -> 10 # insert more nodes l.insert(0, 60) l.insert(0, 70) l.insert(0, 80) print(l) # 80 -> 70 -> 60 -> 40 -> 20 -> 50 -> 30 -> 10 l.delete(2) # delete a node in the first half print(l) # 80 -> 70 -> 40 -> 20 -> 50 -> 30 -> 10 l.delete(4) # delete a node in the second half print(l) # 80 -> 70 -> 40 -> 20 -> 30 -> 10 l.delete(0) # delete the first node print(l) # 70 -> 40 -> 20 -> 30 -> 10 l.delete(4) # delete the last node print(l) # 70 -> 40 -> 20 -> 30 if __name__ == '__main__': main()