猿问

将项目添加到链接列表的末尾会产生奇怪的结果

我正在尝试将元素添加到链接列表的末尾,但看不到这种情况。似乎总是在链接列表的末尾添加“无”。我不确定为什么会发生这种情况,并且我猜想这与我的.next设置不正确有关。我正在使用python来实现我的链表。有人可以帮我吗


下面是我的Node类


class Node: 

    def __init__(self):

        self.data = None

        self.next = None

    

    def get_data(self):

        return self.data

    

    def set_data(self, data):

        self.data = data

        

    def get_next(self):

        return self.next

    

    def set_next(self, node):

        self.next = node

这是我的带有插入方法的链表类


class SingleyLinkedList:

    

    def __init__(self):

        self.head = Node()

    

    def insertAtHead(self, data):

        currentNode = self.head


        newNode = Node()

        newNode.set_data(data)  

        

        if currentNode != None:

            newNode.set_next(currentNode)

            self.head = newNode

            print("Inserted ", data, " at the head")

        else:

            self.head.set_next(newNode)

    

    def insertAtEnd(self, data):

        currentNode = self.head

        

        new_node = Node()

        new_node.set_data(data)

        

        while currentNode.get_next() != None:

            currentNode = currentNode.next

        

        currentNode.set_next(new_node)

        print("Inserted ", data, " at end")

    

    def printNode(self):

        print("\nPrinting the nodes")

        currentNode = self.head

        

        while currentNode.next != None:

            print(currentNode.data, " --> ", end="")

            currentNode = currentNode.next

        print(" NULL \n")


s = SingleyLinkedList()


s.insertAtHead(5)

s.printNode()


s.insertAtHead(10)

s.printNode()


s.insertAtHead(1)

s.printNode()


s.insertAtEnd(20)

s.printNode()

我得到以下结果,


头部插入5


打印节点5-> NULL


头部插入10


打印节点10-> 5-> NULL


头部插入1


打印节点1-> 10-> 5-> NULL


末尾插入20


打印节点1-> 10-> 5->无-> NULL


慕婉清6462132
浏览 146回答 3
3回答

桃花长相依

首先,您Node()拥有None不正确值的init head头应该有一个空头,这就是为什么None最后看到它的原因,因为它传播到结尾,最后您不打印最后一个,Node()因为最后一个节点没有next此条件,因此不显示Node没有下一个:    while currentNode.next != None:        print(currentNode.data, " --> ", end="")        currentNode = currentNode.next因此,您需要再打印一张。下面的工作示例略有简化:class Node:    def __init__(self, data=None, next=None):        self.data = data        self.next = next    def get_data(self):        return self.data    def set_data(self, data):        self.data = data    def get_next(self):        return self.next    def set_next(self, node):        self.next = nodeclass SingleyLinkedList:    def __init__(self):        self.head = None    def insertAtHead(self, data):        old_head = self.head        self.head = Node(data, old_head)        print("Inserted ", data, " at the head")    def insertAtEnd(self, data):        currentNode = self.head        while currentNode.get_next() != None:            currentNode = currentNode.next        currentNode.set_next(Node(data))        print("Inserted ", data, " at end")    def printNode(self):        print("\nPrinting the nodes")        currentNode = self.head        while currentNode.next != None:            print(currentNode.data, " --> ", end="")            currentNode = currentNode.next        print(currentNode.data, " --> ", end="")        print(" NULL \n")s = SingleyLinkedList()s.insertAtHead(5)s.printNode()s.insertAtHead(10)s.printNode()s.insertAtHead(1)s.printNode()s.insertAtEnd(20)s.printNode()输出:Inserted  5  at the headPrinting the nodes5  -->  NULL Inserted  10  at the headPrinting the nodes10  --> 5  -->  NULL Inserted  1  at the headPrinting the nodes1  --> 10  --> 5  -->  NULL Inserted  20  at endPrinting the nodes1  --> 10  --> 5  --> 20  -->  NULL 

倚天杖

您的代码中的问题是:self.head = Node()例如,当您实例化SingleyLinkedList类时。您正在将链接列表对象的头分配给下一个为的此类节点None。因此,您将获得None打印声明Printing the nodes 1 --> 10 --> 5 --> None --> NULL下面是正确的代码:class Node:    def __init__(self):        self.data = None        self.next = None    def get_data(self):        return self.data    def set_data(self, data):        self.data = data    def get_next(self):        return self.next    def set_next(self, node):        self.next = nodeclass SingleyLinkedList:    def __init__(self):        self.head = None    def insertAtHead(self, data):        newNode = Node()        newNode.set_data(data)        if self.head:            newNode.next = self.head            self.head = newNode        else:            self.head = newNode        print "Inserted ", data, " at the head"    def insertAtEnd(self, data):        currentNode = self.head        new_node = Node()        new_node.set_data(data)        while currentNode.get_next() != None:            currentNode = currentNode.next        currentNode.set_next(new_node)        print("Inserted ", data, " at end")    def printNode(self):        print("\nPrinting the nodes")        currentNode = self.head        while currentNode != None :            print currentNode.data,            print " --> ",            currentNode = currentNode.next        prints = SingleyLinkedList()s.insertAtHead(5)s.printNode()s.insertAtHead(10)s.printNode()s.insertAtHead(1)s.printNode()s.insertAtEnd(20)s.printNode()输出为:Inserted  5  at the headPrinting the nodes5  --> Inserted  10  at the headPrinting the nodes10  -->  5  --> Inserted  1  at the headPrinting the nodes1  -->  10  -->  5  --> Inserted  20  at endPrinting the nodes1  -->  10  -->  5  -->  20  --> 
随时随地看视频慕课网APP

相关分类

Python
我要回答