I wanted to extend karin's answer here where she uses a for loop for loop to print the linked list.
I would like to have __str__ method that is part of SinglyLinkedList but would like to reuse the __iter__ method as it is without the except clause which comes with StopIteration given that the answers here say that try statements are cheap except when catching the exception. Is there anyway to go about it? Is it even possible? If I understand this correctly, the for loop calls __iter__ so it would run into the same StopIteration.
The code that I have that works is here.
from typing import Optional
# Definition for singly-linked list.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def __str__(self):
return f"Node:{self.val} Next:{self.next.val if self.next else 'None'}\n"
class SinglyLinkedList():
def __init__(self):
self.head = None
self.tail = None
def __iter__(self):
node = self.head
while node:
yield node
node = node.next
def add(self, node):
if not self.head:
self.head = node
else:
self.tail.next = node
self.tail = node
def __str__(self):
iterator = self.__iter__()
values = []
try:
while True:
values.append( str(next(iterator).val) )
except StopIteration:
pass
return "->".join(values)
one = ListNode(1)
two = ListNode(2)
three = ListNode(3)
four = ListNode(4)
five = ListNode(5)
ll = SinglyLinkedList()
ll.add(one)
ll.add(two)
ll.add(three)
ll.add(four)
ll.add(five)
print(ll)
which gives me the output that I would like.
1->2->3->4->5
The other way I could do think of is to reuse code a while loop
def __str__(self):
values = []
node = self.head
while node:
values.append( str(node.val) )
node = node.next
return "->".join(values)