https://en.wikipedia.org/wiki/Linked_list
A linked list is a linear collection of items.
class Node:
def __init__(self, data=None, next=None):
self.data = data
self.next = next
def __str__(self):
return str(self.data)
class SingleList:
def __init__(self):
self.head = None
self.tail = None
def is_empty(self):
return self.head is None
def insert_head(self, data): # O(1) time
node = Node(data)
if self.is_empty():
self.head = self.tail = node
else:
node.next = self.head
self.head = node
def insert_tail(self, data): # O(1) time
node = Node(data)
if self.is_empty():
self.head = self.tail = node
else:
self.tail.next = node
self.tail = node
def remove_head(self): # O(1) time
if self.is_empty():
raise ValueError("empty list")
node = self.head
if self.head == self.tail:
self.head = self.tail = None
else:
self.head = self.head.next
node.next = None # cleaning
return node.data
# Usage.
SL = SingleList() # head = tail = None
SL.insert_head(11) # [11]
# head=tail
# +----++
# | 11 ||
# +----++
SL.insert_head(22) # [22, 11]
# head tail
# +----++ +----++
# | 22 |+--o| 11 ||
# +----++ +----++
SL.insert_tail(33) # [22, 11, 33]
# head tail
# +----++ +----++ +----++
# | 22 |+--o| 11 |+--o| 33 ||
# +----++ +----++ +----++
while not SL.is_empty(): # order 22, 11, 33
print(SL.remove_head())
# Solution 1.
# SL = SingleList()
# assert not isinstance(iter(SL), SingleList)
# assert id(iter(SL)) != id(SL)
class SingleList:
# ... other methods ...
def __iter__(self): # using a generator function
node = self.head
while node:
yield node.data
node = node.next
# Solution 2.
# SL = SingleList()
# assert isinstance(iter(SL), SingleList)
# assert id(iter(SL)) == id(SL)
class SingleList:
# ... other methods ...
def __iter__(self):
self.current = self.head
return self
def __next__(self):
if self.current:
node = self.current
self.current = self.current.next
return node.data
else: # self.current is None
raise StopIteration
next = __next__ # compatibility
# Usage.
SL = SingleList()
SL.insert_head(11) # [11]
SL.insert_head(22) # [22, 11]
SL.insert_tail(33) # [22, 11, 33]
for item in SL: # order 22, 11, 33
print(item)