无法让 LinkedList 实现工作 (Python)



我觉得今天早些时候应该再问一个问题,因为这个问题与以前大不相同。我想把另一个问题留作参考。而且这里已经很乱了。如果这是个问题,请告诉我。

据我所知,链接列表中没有添加任何内容。这没有打印任何内容,也没有给我任何错误,这就是我的问题。它应该按字母顺序插入单词。我觉得一切都合乎逻辑。我重拨了大部分插入()。

我给它提供了每行只有一个单词的文件。列表的唯一功能是插入和打印。示例文本(不包括空行):

这是代码:

import sys, os, copy, fileinput
class Node:
    def __init__(self, word):
        self.data = word
        self.next = None
    def nextNode(self):
        if self.next is not None:
            return self.next
        else:
            return None
    def getData(self):
        return self.data
    def setNext(self, node):
        self.next = node
    def hasNext(self):
        if self.next == None:
            return False
        else:
            return True
class Linked_List:
    def __init__(self):
        self.head = Node(None)
        self.isempty = True
    def insert(self, word):
        newNode = Node(word)
        #Look for position to insert:
        #When empty
        if self.isempty == True:
            self.isempty = False
            self.head = newNode
        #When has more than two nodes
        else:
            prev = None
            current = self.head
            nextFound = False #the next would be the current when it is less than node
            while nextFound == False and current != None:
                if current.getData() < newNode.getData():
                    prev = copy.copy(current)
                    current = current.nextNode()
                else:
                    nextFound = True
            if prev == None:
                nextNode = copy.copy(current)
                self.head = newNode
                self.head.setNext(nextNode)
            else:
                prev.setNext(newNode)
                newNode.setNext(current)
    def printLinkedList(self):
        if self.head.getData() == None:
            print("The file was empty.")
        else:
            prints = self.head
            while prints.hasNext():
                sys.stdout.write(prints.getData() + 'n')
                prints.setNext(prints.nextNode())
linkedlist = Linked_List()
wordlist = ["hello", "jupiter", "albacore", "shrimp", "axe"]
for line in wordlist:
    linkedlist.insert(line)
linkedlist.printLinkedList()

问题是您在这里复制了上一个节点:

prev = copy.copy(current)

所以,当你在这里更新副本时:

prev.setNext(newNode)

…它不会影响实际链接到列表中的原始节点。(也不会用修改后的副本替换原始节点。)因此,不会有任何更改。

要修复它,只需移除copy.copy


当你修复它时,你的代码中还有另一个错误,它将导致在printLinkedList:中打印出"绝对"的无限循环

prints.setNext(prints.nextNode())

这不会做任何有用的事情——它将prints.next设置为prints.next。至关重要的是,它不会更新变量prints以指向下一个节点。只需这样做:

prints = prints.nextNode()

对于这两个更改,原始示例的输出是:

absolute
crisp
daytona
demand
extra

但是,请注意,您的新示例缺少一个值:

albacore
axe
hello
jupiter

我让你来弄清楚shrimp去了哪里。(如果你陷入困境,你可以随时发布一个新问题。)


如果你想知道我是如何发现问题的:

我在while循环之后添加了一个print语句,该语句转储了一堆关于找到的上一个节点的信息,包括它的id,以及在setNext前后的另一个print,因此我可以看到,每次通过循环,我都成功地设置了第一个节点的next成员,但每次通过,它总是一个不同的第一个节点。

然后我添加了一个print来显示每个节点的id,很明显,每次找到的前一个节点实际上并不是列表中的任何节点。这时copy.copy终于向我扑来。

相关内容

  • 没有找到相关文章

最新更新