2016-05-06 35 views
-2

我得到這個作業,這裏是我的代碼:有時沒有打印 - 有時不打印,不能得到原因?

class Doubly_linked_node(): 
    def __init__(self, val): 
     self.value = val 
     self.next = None 
     self.prev = None 

    def __repr__(self): 
     return str(self.value) 

class Deque(): 
    def __init__(self): 
     self.header = Doubly_linked_node(None) 
     self.tailer = self.header 
     self.length = 0 

    def __repr__(self): 
     string = str(self.header.value) 
     index = self.header 
     while not (index.next is None): 
      string+=" " + str(index.next.value) 
      index = index.next 
     return string 


    def head_insert(self, item): 
     new = Doubly_linked_node(item) 

     new.next=self.header 
     self.header.prev=new 

     self.header=new 
     self.length+=1 

     if self.tailer.value==None: 
      self.tailer = self.header 

    def tail_insert(self, item): 
     new = Doubly_linked_node(item) 

     new.prev=self.tailer 
     self.tailer.next=new 

     self.tailer=new 
     self.length+=1 

     if self.header.value==None: 
      self.header = self.tailer 

它建立一個堆棧,使您可以添加和刪除頭部或尾部的物品(我沒有包括所有的代碼只有重要的東西)。

當我發起一個對象,如果我回到self.next它打印None,但如果我回到self.prev,它打印什麼,只是跳過,我不明白爲什麼,因爲他們都被定義爲你看到的完全一樣,和如果我只插入頭幾次例如for i in range(1,5): D.head_insert(i),然後我打印D它打印5 4 3 2 1 None但如果我做尾巴插入例如for i in range(1,5): D.tail_insert(i)和打印D它打印1 2 3 4 5",因爲它應該沒有None。這是爲什麼?

我已經包含的圖像:

image

+1

作爲一個經驗法則,用「是無」,而不是==無:http://stackoverflow.com/questions/3257919/is-none-vs-none – danielfranca

+1

請請參閱http://stackoverflow.com/help/mcve-有關代碼的問題應包含儘可能少的代碼以重現相同的問題。 –

+0

「Deque」類中沒有'head'和'tail'方法 –

回答

1
  1. 請記住,您創建一個Deque這是不是空的。您正在使用具有值的節點初始化它None

  2. 您正在交換value和節點對象。當你正在檢查if self.tailer.value==None:它可能不是你的意思是什麼

  3. 按照與第2點是爲空的Deque,其中頭和報尾爲None

這裏特殊的處理是我有什麼記住,如果我會執行Deque。我稍微改變了__repr__的返回值。

class Deque(): 
    def __init__(self): 
     self.header = None 
     self.tailer = None 
     self.length = 0 

    def __repr__(self): 
     if self.header is None: 
      return 'Deque<>' 
     string = str(self.header.value) 
     index = self.header.next 
     while index!=None: 
      string+=" " + str(index.value) 
      index = index.next 
     return 'Deque<'+string+'>' 

    def head_insert(self, item): 
     new = Doubly_linked_node(item) 

     new.next=self.header 
     if self.length==0: 
      self.tailer=new 
     else: 
      self.header.prev=new 

     self.header=new 
     self.length+=1 

    def tail_insert(self, item): 
     new = Doubly_linked_node(item) 

     new.prev=self.tailer 
     if self.length==0: 
      self.header=new 
     else: 
      self.tailer.next=new 

     self.tailer=new 
     self.length+=1 
+0

'class Doubly_linked_node():'是作爲練習的一部分給出的,因此我必須在其中插入一定的值。如果不是插入'None',你會如何建議我啓動'Deque'? – Tallb

+0

謝謝Gunther,這是一個很好的解決方案,通過不啓動'Deque'作爲'Doubly_linked_node'並避免節點引用None;我會指出,我沒有使用所有==的長度的原因是它是另一部分作業(最初我只有頭和尾部)的後一個添加。 – Tallb

+0

我仍然認爲我' d堅持'while while not(str(index.next)==「None」):'因爲它更快速的修復...(雖然非常難看) – Tallb

1

繼Günthers建議,我已經修改了__repr__這樣:

def __repr__(self): 
    string = str(self.header.value) 
    index = self.header 
    while not (str(index.next) == "None"): 
     string += (" " + str(index.next.value)) 
     index = index.next 
    return string 

這並不能解決問題,但它是我所見過的最醜陋的解決方案。

有沒有人知道更好的方法?

0

繼我在這裏提出一個更好的方法__repr__的問題。使用__iter__方法擴展Deque類。所以,你可以遍歷Deque這是不錯的,例如:

for item in D: 
    print item 

基於該__repr__方法簡單。這裏是整個變化:

def __repr__(self): 
    return 'Deque<'+' '.join([str(item.value) for item in self])+'>' 

def __iter__(self): 
    index=self.header 
    while index is not None: 
    yield index.value 
    index=index.next 
+0

預定義的函數,我不允許添加任何,只是爲了填補內容。 – Tallb