Я пытаюсь преобразовать строку в двусвязный список. Я хочу иметь возможность пройти по нему, найти совпадение, а затем вставить еще один связанный список в определенное место. Однако у меня проблемы с указателями. У меня есть указатели 'current.prev', 'current' и 'current.next', которые все должны указывать на узлы в указанном порядке. Вместо этого мои указатели .prev и current всегда указывают на одно и то же. Мне нужно указать на разные части связанного списка, иначе я не смогу вернуться в определенное место, чтобы вставить новый связанный список.

Это код, который создает для меня двусвязные списки:

#-----------------------doubly-linked-lists-----------------------#
class NodeD:
    def __init__(self, data):
        self.data = data
        self.next = None
        self.prev = None
    

class DoublyLL:
    def __init__(self):
        self.head = None
        
    def append(self, new_data):
        new_node = NodeD(new_data)
        if self.head is None:
            self.head = new_node
            return
        last = self.head
        while last.next:
            last = last.next
        last.next = new_node
        new_node.prev = last
        return
    
    def printList(self, node):
        while node:
            print(node.data, end=""),
            last = node
            node = node.next

Это код, который превращает строку в связанный список:

#making-linked-lists-from-strings#

def dnaToLL(dnainput):
    dnaLL = DoublyLL()
    head = NodeD(dnainput[0])
    dnaLL.head = head
    current = dnaLL.head
    for i in range(1, len(dnainput)):
        current.prev = current
        current = current.next
        current.next = NodeD(dnainput[i])
    return dnaLL

Я использовал это, чтобы проверить, куда указывают указатели:

dnaLL = dnaToLL(DNA)
dnaLL = dnaLL.head
print(dnaLL.prev.data +dnaLL.data+dnaLL.next.data)

Но с этим вводом:

S1 = "neho"
DNA = "imfinehowru"

Я получаю такой вывод:

iim

Есть идеи, где я ошибся? Я предполагаю, что именно здесь я пытался превратить строки в двусвязные списки, но любой другой порядок, в котором я помещаю указатели, дает мне ошибки.

Спасибо за помощь!

1
Kay 5 Май 2021 в 03:55

1 ответ

Лучший ответ

Проблема в том, что когда вы выполняете current.prev = current, вы говорите «предыдущий узел является текущим узлом», а не фактическим предыдущим узлом.

Имейте в виду, что первый узел в списке должен иметь .prev = None. Вам нужно только установить .prev для будущих узлов. Это изменение должно исправить вашу функцию dnaToLL():

def dnaToLL(dnainput):
    dnaLL = DoublyLL()
    head = NodeD(dnainput[0])
    dnaLL.head = head
    current = dnaLL.head
    for i in range(1, len(dnainput)):
        # note how the order is changed
        current.next = NodeD(dnainput[i])
        current.next.prev = current
        current = current.next
    return dnaLL
1
Green Cloak Guy 5 Май 2021 в 01:01