Смысл кругового связного списка состоит в том, чтобы пропустить всю логику «если следующий не не None».В начале голова указывает на себя, указывая, что список пуст.Нет необходимости создавать пустое «first» - в самом начале выполните:
self.head = Link(None, None)
self.head.next = self.head
Затем, чтобы вставить узел после какого-либо другого узла, вы просто делаете:
def insert_after(insert_node, after_node):
insert_node.next = after_node.next
after_node.next = insert_node
Чтобы вставить в начало списка, выполните:
insert_after(node, head)
Для вставки перед требуется выполнить итерацию для поиска узла «до», поскольку список только однократно связан:
def insert_before(node, before_node):
loc = head
while loc.next is not before_node:
loc = loc.next
insert_after(insert_node, loc)
Комувставьте в конец списка, выполните:
insert_before(node, head)
Чтобы получить все элементы списка, выполните:
current = self.head.next
while current is not self.head:
# do something with current.data
# advance to next element
current = current.next
Но настоящая сила в круговом списке - сделать его вдвойнесвязаны, так что вы можете вставить раньше без итерации.