下面是代码段:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
...
val = carry
for l in filter(None, [l1, l2]):
val += l.val
l = l.next
l1和l2是两个链表。如果列表为空,则将其设置为None,这样,循环仅在尚未完全遍历链接列表时才处理它。我想使用循环来防止代码重复。 问题出在第四行,在循环的迭代中,l1或l2都不用列表的下一个节点更新,而l则进行了更新。有人知道有什么好的方法可以解决此问题吗?抱歉,是否曾有人问过这个问题,但我不知道搜索答案的正确术语。也许定义一个单独的函数或一个匿名函数将是最好的方法?
我认为您正试图以一种尴尬的方式推广此代码。我会给ListNode
一个__iter__
方法(或类似的方法),然后使用:
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def __iter__(self):
cur_node = self
while cur_node:
yield cur_node.val
cur_node = cur_node.next
完成后,可以迭代列表节点,只需将l1
和l2
传递给sum
:
l1_sum = sum(l1)
l2_sum = sum(l2)
[当您执行l = l.next
之类的操作时,您只是在更改名称l
指着。如果制作一个包装列表节点的链接列表类,您将能够更改链接列表对象,而无需引用您的名称分配给它。
我添加了一些用于演示目的的方法。
class ListNode:
def __init__(self, x, next=None):
self.val = x
self.next = next
@classmethod
def from_values(cls, values):
try:
first_val = next(values)
return cls(first_val, cls.from_values(values))
except StopIteration:
return None
def __iter__(self):
yield self.val
if self.next is not None:
yield from self.next
class LinkedList:
def __init__(self, values):
self.head = ListNode.from_values(iter(values))
def __bool__(self):
return bool(self.head)
def __str__(self):
if self.head is None:
return "<>"
return "<{}>".format(", ".join(str(i) for i in self.head))
l1 = LinkedList([])
l2 = LinkedList([1, 2, 3])
print(l1)
print(l2)
for l in filter(None, [l1, l2]):
l.head= l.head.next
print(l1)
print(l2)
有输出:
<>
<1, 2, 3>
<>
<2, 3>