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