2014-03-12 29 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