pop_head method needs check before attempting to assign
self.first_node.previous_node = None
This is needed if Queue has only one element. The initial self.first_node = self.first_node.next_node is None
Example fix:
def pop_head(self):
if not self.first_node:
return None
popped_node = self.first_node
self.first_node = self.first_node.next_node
if self.first_node:
self.first_node.previous_node = None
return popped_node