报告您未能实现您被要求做的事情的“Pythonic”方式是引发异常。这使您的代码相当简单:
def removeRec(node, value):
if isinstance(node, EmptyNode):
raise ValueError("Cannot remove value from an empty list")
elif node.data == value:
return node.next
else:
node.next = removeRec(node.next, value)
return node
这将适用于您现有的remove
函数,将其留给调用者来处理调用代码中的异常。但是,如果您希望remove
函数返回一个指示成功或失败的布尔值,您可以在此处捕获异常:
def remove(lst, value):
try:
lst.head = removeRec(lst.head, value)
return True # only reached if no exception was raised by the recursion
except ValueError:
return False
如果出于某种原因(例如在尚未教授它们的课程中)您坚决反对使用异常,您可以在递归调用的返回值中编码删除失败,但是您需要对其进行额外检查,以避免损坏您的列表:
def removeRec(node, value):
if isinstance(node, EmptyNode):
print("Cannot remove value from an empty list")
return None # your code did this implicitly, I'm being explicit
elif node.data == value:
return node.next
else:
rec_result = removeRec(node.next, value)
if rec_result is None:
return rec_result
else:
node.next = rec_result
return node
然后,您可以对非递归函数中的递归情况进行相同的检查,并将结果值转换为布尔值:
def remove(lst, value):
rec_result = removeRec(lst.head, value)
if rec_result is None:
return False
else:
lst.head = rec_result
return True