when deleting the entire linked list using the "delete_entire(self)" method. It throws no attribute error. Although the above code is running fine. Instead of printing the blank list, it is giving the no attribute error.
class Node:
def __init__(self,value):
self.value = value
self.next = None
class CircularSinglyLinkedList:
def __init__(self):
self.head = None
self.tail = None
def __iter__(self):
node = self.head
while True:
yield node
if node.next is self.head:
break
node = node.next
def insertion(self, value, location):
new_node = Node(value)
if self.head is None:
self.head = new_node
self.tail = new_node
self.tail.next = self.head
else:
if location == 0:
new_node.next = self.head
self.head = new_node
self.tail.next = new_node
elif location == -1:
self.tail.next = new_node
new_node.next = self.head
self.tail = new_node
else:
temp_node = self.head
index = 0
while index < location -1:
if temp_node.next is self.head:
break
temp_node = temp_node.next
index = 1
next_node = temp_node.next
temp_node.next = new_node
new_node.next = next_node
if new_node.next is self.head:
self.tail = new_node
#---------------------------------------------------------------------------------------------#
# deleting the entire linked list
def delete_entire(self):
self.head = None
self.tail.next = None
self.tail = None
cll = CircularSinglyLinkedList()
cll.insertion(2,1)
cll.insertion(3,2)
cll.insertion(5,3)
cll.insertion(6,4)
cll.insertion(0,0)
cll.insertion(10,-1)
print([node.value for node in call])
output = [0, 2, 3, 5, 6, 10]
cll.delete_entire()
print([node.value for node in call])
AttributeError: 'NoneType' object has no attribute 'value'
The expected output is to be
[ ]
CodePudding user response:
Your __iter__() method always yields once, even when the list is empty, since it does yield node before checking whether node is None. Whenthe list is empty, that will yield None, and the caller will try to use None.value.
You should stop the loop as soon as node is None.
def __iter__(self):
node = self.head
while node:
yield node
node = node.next
