我想在这里扩展karin的回答,她使用for循环for循环来打印链表。
我希望__str__
方法是SinglyLinkedList
的一部分,但希望重用__iter__
方法,因为它没有StopIteration
附带的except
子句,因为这里的答案说try
语句是廉价的,除非捕获异常. 有什么办法吗?这可能吗?如果我理解正确的话,for
循环调用__iter__
,因此它将运行到相同的StopIteration
。
我有工作的代码在这里。
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)
给出我想要的输出。
1->2->3->4->5
我能想到的另一种方法是在while循环
中重用代码def __str__(self):
values = []
node = self.head
while node:
values.append( str(node.val) )
node = node.next
return "->".join(values)
您可以在这里使用一个简单的理解:
def __str__(self):
return '->'.join(str(i.val) for i in self)
好消息:
- 没有逐个元素构建的列表(实际上根本没有列表,只是一个生成器)
- 没有显式处理
StopIteration
(由推导式在下处理)
虽然我不期望有很大的性能提升,但至少编写和维护的时间更短了…