2017-10-17 45 views
2

我正在使用Python 3.6.3。我正在尝试在Python中编写一个简单的链接列表。这里是我的代码:Python - 链接列表节点比较需要额外的解引用

class Node(object): 
    """Represents a node within a linked list""" 
    def __init__(self, data, next=None): 
     self.stuff = data 
     self.next = next 

    def __str__(self): 
     return str(self.stuff) 

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

    def append(self, data): 
     if not self.head: 
      self.head = Node(data) 
      return 
     else: 
      n=self.head 
      while n.next: 
       n = n.next 

      new_node = Node(data) 
      n.next = new_node 
      return 

    def insertAfter(self, data, newNode): 
     if not self.head: 
      return 
     else: 
      n=self.head 
      while n and n.stuff != data: 
       n = n.next 

      if not n: 
       return 
      else: 
       newNode.next = n.next 
       n.next = newNode 
       return 

    def printlist(self): 
     if not self.head: 
      print("List is empty") 
      return 
     else: 
      n = self.head 
      while n: 
       print(str(n)) 
       n = n.next 
     return 

ll = LinkedList() 
ll.append(Node("1")) 
ll.append(Node("2")) 
ll.append(Node("3")) 
ll.insertAfter("2", Node("2.5")) 
ll.printlist() 

我希望它打印:

1 
2 
2.5 
3 

但是,相反它打印:

1 
2 
3 

调试后,我意识到,改变该线路insertAfter方法:

while n and n.stuff != data: 

至:

while n and n.stuff.stuff != data: 

打印预期输出。 我不明白为什么它这样做。 请帮忙。 谢谢

回答

3

问题是你没有添加1,2,3到LinkedList,并让它创建一个Node来包装每个。您正在添加一个Node,其stuff变量为1,2和3.当您调用append方法来添加每个Node时,它们会被append方法包装在另一个Node中。因此您需要拨打Node.stuff.stuff访问存储的实际元素。

看看你的append方法实际上在做什么。它接受一些参数data,然后用任意行self.head = Node(data)或取决于是否LinkedList已经有一个头Node与否行new_node = Node(data),创建一个Node

ll.append(Node("1"))改为ll.append("1")。或者,改变你的append方法,假设它正在传递一个Node对象。 第一种解决方案更加可取,因为Node类在LinkedList类的上下文之外几乎没有用处,并且LinkedList不起作用,除非它填充了Nodes反正;这似乎是额外的工作,使LinkedList类的用户每次都必须创建一个Node

编辑:也是什么原因你传递数字作为字符串?你不需要把1,2,2.5和3放在引号中,除非你特别希望它们是字符串 - 但是如果是这样,为什么?

+0

我现在感觉很傻!我在玩弄东西的时候已经做出了这个改变,并且已经注意到我已经在追加方法中进行了改变。 谢谢。 –