2014-03-12 28 views
1

我想在另一个程序中为节点创建一个类(它可以作为一个队列的系统)到import。我知道其他程序工作正常,因为它工作在import另一种使用相同函数名称(基于Python常规list)的队列中。但是,使用这种队列类型,我似乎无法使其工作。我敢肯定,我的代码存在很多问题(因为我收到了各种各样的错误消息),并且希望我能改变一些内容。我的链接列表有什么问题?

下面是类代码:

class Node(): 
    def __init__(self, v=None, n=None): 
     self.item=v 
     self.next=n 

    lastnode=__init__ 

    def put(self, v): 
     Node.lastnode.next=self 
     self.item=v 
     self.next=None 
     Node.lastnode=Node.lastnode.next 

    def get(self): 
     if Node.isempty(self): 
      return None 
     out=Node.__init__.next 
     Node.__init__.next=out.next 
     out.next=None 
     return ut.item 

    def isempty(self): 
     if Node.lastnode==Node.__init__: 
      return True 
     else: 
      return False 

put功能的作用是把最后一个队列中的新项目/节点。

get函数的作用是从队列中删除第一个节点,return其项目。

isempty函数用来检查队列是否为空。

请给我一些批评。

+1

您的问题属于上http://codereview.stackexchange.com – martineau

+0

BTW:请记住,内建高度优化 - 如果你想用你的解决方案在实际-life应用程序,使用标准列表,如果您有充分的理由不使用它,请使用python将其原型化,然后为您的数据结构编写C扩展。 –

+0

是的,我猜到了,这仅仅是为了学习语言。 – user3411693

回答

1

你的主要问题是,你试图用一个类来解决真正需要两个类的问题。链接列表涉及两种项目:节点和列表结构本身。一个节点只“知道”两件事:它包含的数据和它链接到的下一个节点的身份。列表对象是管理对一组链接节点的访问权限。通过试图将这两个角色合并到一个类中,你就不可能实现一个列表。想想,例如,你的班级如何管理多个节点。您试图通过使用列表级数据的类属性(例如头节点的标识)来解决这些困难,但即使可以使其工作,您也只能工作每次只有一个列表实例。

除此之外,你的代码有一些基本的语法问题。例如,行lastnode=__init__不叫__init__;调用语法应该是lastnode=__init__(),但是你不能在类定义的主体中这样做。

这里有一个简单的实现,你可以学习:

class Node(object): 

    def __init__(self, value=None, next=None): 
     self.value = value 
     self.next = next 

class List(object): 

    def __init__(self): 
     self.head = None 

    def put(self, value): 
     new = Node(value) 
     new.next = self.head 
     self.head = new 

    def get(self): 
     if self.is_empty(): 
      return None 
     old = self.head 
     self.head = old.next 
     return old.value 

    def is_empty(self): 
     return self.head is None 
+0

非常感谢! – user3411693