Рекурсивный метод в классе, создающий бесконечно повторяющееся значение

#python #recursion #data-structures #linked-list

Вопрос:

извините за вопрос новичка здесь.

Я пытаюсь реализовать метод вставки для класса связанного списка, используя рекурсию, как показано в приведенном ниже коде.
Однако, когда я пытаюсь это сделать, я получаю список, который бесконечно повторяет значение, которое я хочу вставить.

напр.
1-й узел — «а»,
2-й узел — «в»,
3-й узел — «с».

Если бы я использовал код для вставки «d» в качестве нового 3-го узла, я бы получил » abddddddd….» до бесконечности.

Был бы очень признателен за некоторые советы о том, что вызвало такое поведение.

 class linked_list():


    def __init__(self, node):
        self.node = node


    def insert_at_index (self, index, value, node=None, current_index=0):
        def insert_recur(index, new_node, node, current_index):
            if current_index == index:
                node.next_node = new_node
                new_node.next_node = node.next_node
                return None
            else:
                return insert_recur(index, new_node, node.next_node, current_index 1)
        
        new_node = Node(value)
        if index == 0:
            new_node.next_node = self.node
            self.node = new_node
            return
        else:
            node = self.node 
            insert_recur(index, new_node, node, current_index)
 

Ответ №1:

Проблема в том, что здесь:

 if current_index == index:
    node.next_node = new_node
    new_node.next_node = node.next_node
    return None
 

После присвоения node.next_node = new_node старое значение node.next_node было потеряно. Последующее задание, new_node.next_node = node.next_node , эквивалентно new_node.next_node = new_node . Так new_node становится его собственным преемником.

Попробуйте изменить порядок выполнения заданий:

 if current_index == index:
    new_node.next_node = node.next_node
    node.next_node = new_node
    return None
 

Комментарии:

1. Не могу поверить, что я это пропустил! Большое спасибо! Помечено как ответ 😀