为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕婉清6462132 2021-05-11 17:21:55
我正在尝试将元素添加到链接列表的末尾,但看不到这种情况。似乎总是在链接列表的末尾添加“无”。我不确定为什么会发生这种情况,并且我猜想这与我的.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
查看完整描述

3 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

首先,您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 = node



class 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 head


Printing the nodes

5  -->  NULL 


Inserted  10  at the head


Printing the nodes

10  --> 5  -->  NULL 


Inserted  1  at the head


Printing the nodes

1  --> 10  --> 5  -->  NULL 


Inserted  20  at end


Printing the nodes

1  --> 10  --> 5  --> 20  -->  NULL 


查看完整回答
反对 回复 2021-05-18
?
倚天杖

TA贡献1828条经验 获得超3个赞

您的代码中的问题是:


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 = node


class 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

        print


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 head


Printing the nodes

5  --> 

Inserted  10  at the head


Printing the nodes

10  -->  5  --> 

Inserted  1  at the head


Printing the nodes

1  -->  10  -->  5  --> 

Inserted  20  at end


Printing the nodes

1  -->  10  -->  5  -->  20  --> 



查看完整回答
反对 回复 2021-05-18
  • 3 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信