递归添加到有序链接列表

时间:2017-10-24 06:33:29

标签: python list recursion

我正在尝试创建一个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()

谢谢

1 个答案:

答案 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_emptysize并检查链接列表是否包含任何元素,并相应地指定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)