not优先于or,因此您需要重复not,或者将or表达式作为and放在括号中:if not (lnk and lnk.next):
此外,当您发现重复项时,不应停止该过程,因为重复可能会发生两次以上,并且可能还有其他重复项。在
所以它可以是这样的(使用一个函数将列表表示为字符串):
^{pr2}$
其他一些改进
函数remove_dup是Node的一个很好的候选函数。在
如果你能读写一个链表作为一个标准列表那就太好了。类方法可以用于从值列表创建链接列表,而__iter__方法可以使类成为可编辑的。在
那么它可能是这样的:class Node:
"""Node in a linked list"""
def __init__(self: 'Node', value: object = None, next: 'Node' = None) -> None:
"""Create Node self with data value and successor next."""
self.value, self.next = value, next
def __iter__(self):
yield self.value
if self.next:
yield from iter(self.next) # this needs Python 3.4+
def __repr__(self):
return '->'.join(map(str, list(self))) # uses __iter__
def remove_dup(self):
if not self.next:
return self
if self.value == self.next.value:
self.next = self.next.next
return self.remove_dup() # there might be more duplicates...
else:
return self.next.remove_dup()
@classmethod
def from_list(cls, values):
head = None
for value in reversed(values):
head = cls(value, head)
return head
lst = Node.from_list([1, 3, 3, 3, 4, 4, 5])
print (lst) # 1->3->3->3->4->4->5
lst.remove_dup()
print (lst) # 1->3->4->5
print(list(lst)) # [1, 3, 4, 5]