почему это не дает выходных данных, а ядро ​​продолжает работать так, как если бы оно прошло какой-то цикл? - PullRequest
0 голосов
/ 21 сентября 2019

учимся составлять связанные списки?Просьба предоставить лучшее решение, если это возможно.добавлены функции push, inserttafter, printlist, append.учитесь составлять связанные списки?Просьба предоставить лучшее решение, если это возможно.добавлены функции push, inserttafter, printlist, append.

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

class LinkedList:
    def __init__(self):
        self.head = None 

    def push(self,new_data):
        new_node = Node(new_data)
        new_node.next = self.head
        self.head = new_node
    def insertAfter(self,prev_node,new_data):
        if prev_node is None:
            print('Enter valid previous node data')
            return
        new_node = Node(new_data)
        new_node.next = prev_node.next
        prev_node.next = new_data

    def append(self,new_data):
        new_node= Node(new_data)
        if self.head is None:
            self.head = new_node
        last = self.head
        #while last.next!= None:
            #temp = last.next
            #last =temp.next
        while last.next:
            last = last.next
        last.next = new_node

    def printList(self):
        temp = self.head
        while temp:
            print(temp.data)
            temp = temp.next

if __name__ =='__main__':
    llist = LinkedList()
    llist.append(7)
    llist.append(8)
    llist.push(5)
    llist.insertAfter(Node(5),6)
    llist.printList()

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Проблема в методе append.Когда вы добавляете первый узел, self.head равен None, поэтому вы выполняете:

self.head = new_node

Но затем вы продолжаете пытаться найти узел last, который в этом случае будеттакже в итоге получим self.head:

        last = self.head
        #while last.next!= None:
            #temp = last.next
            #last =temp.next
        while last.next:
            last = last.next

В результате, когда вы выполните эту строку:

last.next = new_node

Вы фактически устанавливаете new_node.next = new_node,что заставляет следующий вызов append войти в бесконечный цикл.

0 голосов
/ 21 сентября 2019

Исправление:

def append(self,new_data):
    new_node= Node(new_data)
    if self.head is None:
        self.head = new_node
        return  # <- this is the fix
    ...

Без этого оператора возврата вы переходите к этому вновь добавленному узлу и присваиваете его .next себе.С этой циклической ссылкой следующая .append() попадает в бесконечный цикл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...