Python 链表突变
对于执行此操作的函数: 删除链接中包含该值的所有节点。假设 第一个元素永远不会被删除 我编写了以下代码,但它没有删除第二项。如果有人能指出我现在没有做什么,我将不胜感激 例如:Python 链表突变,python,Python,对于执行此操作的函数: 删除链接中包含该值的所有节点。假设 第一个元素永远不会被删除 我编写了以下代码,但它没有删除第二项。如果有人能指出我现在没有做什么,我将不胜感激 例如: >>> l1 = Link(0, Link(2, Link(2, Link(3, Link(1, Link(2, Link(3))))))) >>> print(l1) <0 2 2 3 1 2 3> >>> remove_all(l1, 2) >&
>>> l1 = Link(0, Link(2, Link(2, Link(3, Link(1, Link(2, Link(3)))))))
>>> print(l1)
<0 2 2 3 1 2 3>
>>> remove_all(l1, 2)
>>> print(l1)
>>l1=Link(0,Link(2,Link(2,Link(3,Link)(1,Link(2,Link(3))链接(())))
>>>打印(l1)
>>>全部拆除(l1、2)
>>>打印(l1)
正确答案应该是
,但我得到
守则:
def remove_all(link , value):
assert link is not Link.empty
if link.first == value and link.rest == Link.empty:
link.first = Link()
elif link.first == value:
link.first, link.rest = link.rest.first,link.rest.rest
remove_all(link.rest, value)
class Link:
"""A linked list.
>>> s = Link(1)
>>> s.first
1
>>> s.rest is Link.empty
True
>>> s = Link(2, Link(3, Link(4)))
>>> s.first = 5
>>> s.rest.first = 6
>>> s.rest.rest = Link.empty
>>> s # Displays the contents of repr(s)
Link(5, Link(6))
>>> s.rest = Link(7, Link(Link(8, Link(9))))
>>> s
Link(5, Link(7, Link(Link(8, Link(9)))))
>>> print(s) # Prints str(s)
<5 7 <8 9>>
"""
empty = ()
def __init__(self, first, rest=empty):
assert rest is Link.empty or isinstance(rest, Link)
self.first = first
self.rest = rest
def __repr__(self):
if self.rest is not Link.empty:
rest_repr = ', ' + repr(self.rest)
else:
rest_repr = ''
return 'Link(' + repr(self.first) + rest_repr + ')'
def __str__(self):
string = '<'
while self.rest is not Link.empty:
string += str(self.first) + ' '
self = self.rest
return string + str(self.first) + '>'
def remove_all(链接、值):
断言链接不是link.empty
如果link.first==value,link.rest==link.empty:
link.first=link()
elif link.first==值:
link.first,link.rest=link.rest.first,link.rest.rest
全部删除(link.rest,value)
类链接:
“”“链接列表。”。
>>>s=链路(1)
>>>美国优先
1.
>>>rest是Link.empty
真的
>>>s=链路(2,链路(3,链路(4)))
>>>s.first=5
>>>s.rest.first=6
>>>s.rest.rest=Link.empty
>>>s#显示报告的内容
链接(5,链接(6))
>>>s.rest=链接(7,链接(8,链接(9)))
>>>
链环(5,链环(7,链环)(链环(8,链环(9)))
>>>打印#打印str(s)
"""
空=()
定义初始化(self,first,rest=empty):
断言rest为Link.empty或isinstance(rest,Link)
self.first=第一
self.rest=休息
定义报告(自我):
如果self.rest不是Link.empty:
rest_repr=','+repr(self.rest)
其他:
剩余报告=“”
返回'Link('+repr(self.first)+rest_repr+')”
定义(自我):
字符串=“”
您的函数不需要是递归的。此外,删除下一个对象时,您需要保持在同一对象上,因为新的“rest”也可能有要删除的值(即需要删除的连续值)
如果你给我一个建议,那会很有帮助的。首先,
link
和link
没有定义,尽管我可以推断它们是什么。顺便说一句,欢迎使用堆栈溢出!看看这本书。如果你想要更多的建议,去看看吧。
def remove(link,value):
while link is not Link.empty:
if link.rest is not Link.empty and link.rest.first == value:
link.rest = link.rest.rest
else:
link = link.rest