"""This module defines a simple doubly-linked list implementation. """ class LinkedList: """A doubly-linked list. """ def __init__(self): self.head = None self.tail = None self.size = 0 def append(self, value): n = Node(value) if self.tail is None: self.head = n self.tail = n else: self.tail.next = n n.prev = self.tail self.tail = n self.size += 1 def pop(self, i): """Remove and return the ith element of the list """ if i >= len(self): raise IndexError('Pop index out of range') z = self.head while i > 0: z = z.next i -= 1 if z.prev is not None: z.prev.next = z.next if z.next is not None: z.next.prev = z.prev return z.value def __len__(self): return self.size def __iter__(self): if self.head is None: return z = self.head while True: yield z.value if z.next is not None: z = z.next else: break def __str__(self): return '[' + ', '.join(map(str, self)) + ']' class Node: """A node in the linked list """ def __init__(self, value): self.value = value self.prev = None self.next = None if __name__ == '__main__': li = LinkedList() for x in [5, 4, 3, 2, 1]: li.append(x) print(li) li.pop(2) print(li) print(len(li)) for x in li: print(x)