Как мне добавить второй элемент в связанный список, не перезаписывая первый? - PullRequest
0 голосов
/ 10 июля 2020

Я реализовал связанный список в Python. Первый элемент вставлен правильно. Но второй перезаписывает его в головном узле. И после этого он работает нормально.

class Node:
def __init__(self):
    self.data = None
    self.next = None

class LinkedList:
    def __init__(self):
        self.head = Node()
        self.iterator = self.head

    def isEmpty(self):
        if self.head.data is None:
            return True

    def insert(self, value):
        if self.isEmpty():
            self.head.data = value

        else:
            while self.iterator.next is not None:
                self.iterator = self.iterator.next
            self.iterator.next = Node()
            self.iterator.data = value
            self.iterator = self.head

    def __str__(self):
        l = []
        while self.iterator.next is not None:
            l.append(self.iterator.data)
            self.iterator = self.iterator.next
        self.iterator = self.head
        return str(l)


t = LinkedList()
t.insert(2)
t.insert(4)
t.insert(8)
t.insert(6)
t.insert(10)
t.insert(12)
print(t)

Также в методе str как я могу распечатать данные, если Head - единственный узел. (Поскольку Next of Head - None, он не войдет в while l oop.)

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Добавление self.iterator.next = Node () внутри оператора if метода insert решило эту проблему для меня:

class Node:
    def __init__(self):
        self.data = None
        self.next = None


class LinkedList:
    def __init__(self):
        self.head = Node()
        self.iterator = self.head

    def isEmpty(self):
        if self.head.data is None:
            return True

    def insert(self, value):
        if self.isEmpty():
            self.head.data = value
            self.iterator.next = Node()

        else:
            while self.iterator.next is not None:
                self.iterator = self.iterator.next
            self.iterator.next = Node()
            self.iterator.data = value
            self.iterator = self.head

    def __str__(self):
        l = []
        while self.iterator.next is not None:
            l.append(self.iterator.data)
            self.iterator = self.iterator.next
        self.iterator = self.head
        return str(l)

Вывод:

[2, 4, 8, 6, 10, 12]
0 голосов
/ 10 июля 2020

Здесь, похоже, вы перезаписываете данные на self.iterator. Скорее, вы должны установить данные для нового созданного вами узла:

self.iterator.data = value

Фиксированный код:

class LinkedList:
    def __init__(self):
        self.head = Node()
        self.iterator = self.head

    def isEmpty(self):
        if self.head.data is None:
            return True

    def insert(self, value):
        if self.isEmpty():
            self.head.data = value

        else:
            while self.iterator.next is not None:
                self.iterator = self.iterator.next
            new_node = Node()
            new_node.data = value
            self.iterator.next = new_node
            self.iterator = self.head
...