我正在尝试创建一个add
函数,以递归方式添加到有序链表中,似乎无法启动。我有两个功能
def add(self, item):
new_node = Node(item)
curr = self.__head
prev = None
self.add_recursive(new_node, curr, prev)
def add_recursive(self, new_node, curr, prev):
pass
我知道如何在传统方法中添加到有序链表中但似乎无法通过以这种方式调用它以及递归来包围如何执行它。可以在此课程中使用的其他功能包括.is_empty()
和.size()
谢谢
答案 0 :(得分:1)
当涉及到层次结构(例如树)时,人类大脑可以很容易地看到递归(我们递归地思考),但是对于像链接列表这样的扁平结构,这显然难以实现。
让我们打破这个。我们应该在什么时候添加一个节点?当然,当我们知道curr
前面没有节点时。此时,您将分配curr.next = new_node
并返回。在此之前,您提前curr
并继续。这也是在迭代意义上发生的事情。
将这种理解付诸代码,你就有了
def add_recursive(self, new_node, curr, prev):
""" note that we aren't yet taking care of the case when head is None """
if not curr.next:
curr.next = new_node
return
return self.add_recursive(new_node, cur.next, cur)
一个重要的考虑因素是在第一次插入时的角落情况。在这种情况下,您可以致电.is_empty
或size
并检查链接列表是否包含任何元素,并相应地指定self.head = new_node
:
if self.is_empty():
self.head = new_node
return
这是必须要做的第一次检查。所以,你的全部功能现在变为:
def add_recursive(self, new_node, curr, prev):
if self.is_empty():
self.head = new_node
return
elif not curr.next:
curr.next = new_node
return
return self.add_recursive(new_node, cur.next, cur)