2014-04-05 86 views
-1
def remove(lst,value): 
    curr = lst.head 
    while not isinstance(curr, EmptyNode): 
     if curr.data == value: 
      curr.data=curr.nxt.data 
      curr.nxt =curr.data.nxt 
      lst.size -= 1 
      return lst 
     curr = curr.nxt 
     return True 
    return False 

该函数应该删除给定的值,并返回一个布尔值(True)。例如,如果我输入:Python链接列表,删除函数iter

remove(lstA, 'b') 

它应该返回True,但是当我运行我的程序,它给我这个错误消息:

 curr.nxt =curr.data.nxt 
AttributeError: 'str' object has no attribute 'nxt' 

任何一个小提示,将不胜感激

回答

0

您收到错误的原因是因为(链接列表的)节点的数据成员,即curr.data是一个字符串。对字符串做.nxt未定义。你应该做的是,一个节点对象上的.nxt

还有其他问题与您的代码太:

  • 你说,如果一个值在列表中找到,应该将其删除并返回true。但是在你的代码中,在if curr.data == value:之内有一个返回语句,这意味着如果找到要删除的值,该方法将返回该列表而不是True,正如您期望的那样。

  • 此外,看着你的代码,如果它没有找到在当前节点被移除的值,它会递增curr到下一个节点,并返回True

  • 不能删除一个节点从当前位于该节点的链接列表中(这似乎是您的代码中的情况)。只有当您拥有一个保存前一个节点的变量时,才可以这样做。由于在你的代码中,你不保存前一个节点,你应该看看curr.next.data。换句话说,你应该检查if curr.next.data == value:。你需要相应地处理边界条件。

+0

以及我尝试你说的是否cure.next.data ==值:,似乎是工作是什么,但它不是<在0x30e3930 __ __为主。MYLIST对象>输出布尔值,它被输出。 – user3408174

+0

'<__main __。0x30e3930的MyList对象>'意味着正在执行'if'块中的'return lst'。检查我的观点1,为什么你的代码不会返回'True' – shaktimaan

+0

ohh,我看到所以只需将lst更改为True即可,但如果我想从列表中删除一个元素,那么该元素不存在?它应该返回False,但对于我的代码,它不会返回任何内容 – user3408174