无法使LinkedList实现工作(Python)

时间:2013-08-28 23:27:31

标签: python linked-list

我觉得我应该从今天早些时候提出另一个问题,因为问题与以前有很大不同。我想把另一个问题作为参考。它也已经很杂乱了。如果这是一个问题,请告诉我。

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

我在每行输入单个单词的文件。 列表的唯一功能是插入和打印。 示例文本(不包括空行):

以下是代码:

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()

1 个答案:

答案 0 :(得分:2)

问题是你在这里制作了上一个节点的副本:

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去了哪里。 (如果你遇到问题,你总是可以发一个新问题。)


如果您想知道我是如何发现问题的那样:

我在print循环之后添加了一个while语句,该语句会转发大量有关找到的上一个节点的信息,包括其id和另一个print之前和之前的setNextnext之后,我可以看到每次循环时我都成功设置了第一个节点的print成员,但每个节点始终是不同的第一个节点时间过去了。

然后我添加了一个id来显示每个节点的copy.copy,很明显,每次找到的上一个节点都不是列表中实际存在的任何节点。此时{{1}}终于跳出来了。