2014-12-22 50 views
0

我想編寫一個PriorityList隊列,其中所有元素都是一個訂單的基礎。在我的情況下,我想訂購Type ElementType的元素(可以是任何東西,用於測試我使用整數並根據它們的值對它們進行排序,從最高值開始並以最低值結尾)PriorityList - 入隊方法錯誤

但是我處於目前在我的後續方法中發現錯誤。代碼運行,但不能按預期工作。

讓代碼添加3 3 4或3 4 5很好地工作。我得到4 3 3和5 4 3,完全按照它的樣子。 但是,如果我給隊列以下值:5 3 3 4 5 4,我得到:5 3 3; 我期望5 5 4 4 3 3; 我認爲這是可以理解的,什麼是錯誤的,但我不明白指針是否足以解決這個問題。

我會很高興,如果有人可以看看下面的代碼行,並試圖弄清楚,什麼是錯的,以及如何修復它。如有需要,我可以在第二天早上提供更多信息

public void enqueue(ElementType element) { 
     ListNode elem = new ListNode ((ElementType)element);   
     if(head == null) {   
      head = elem; 
      head.data = element; 
      head.next = null; 
      head.prev = null; 
      tail = head; 

     } 
     else { 
      ListNode n = null; 
      n = head; 

      if(element.compareTo(head.data) > 0) { 

       elem.prev = null; 
       head.prev = elem; 
       elem.next = head; 

       head.next = n.next; 
       head = elem; return; 
      } 
      int k = 0; 
      while(element.compareTo(n.data) <= 0) { 
       k++; 
       if(n.next !=null) { 

       n = n.next; 

       } 

       else { 

        elem.prev = n; 
        n.next = elem; 
        tail = elem; 
        elem.next = null; 

        return; } 
      } 

      elem.prev = n.prev; 
      n.prev = elem; 
      elem.next = n; 

      } } 

回答

1

我相信,PriorityQueue可以代替大部分代碼。檢查出the JavaDocs

優先級隊列的元素根據其自然排序或隊列構建時提供的比較器進行排序,具體取決於使用哪個構造函數。

所以,如果ElementType實現Comparable<ElementType>或者如果你提供一個Comparator<ElementType>您應該所有設置。

+0

是的,我已經實現了可比較的 然而,似乎雙鏈表不完全在做,它應該做什麼,我想知道如何解決這些指針問題。 – Imago

+0

@Imago,您是否還使用PriorityQueue 來替換您的隊列代碼? – wassgren

+0

是的,我真的認爲問題在於設定的指針內.. – Imago

0

正如wasgren所指出的,這段代碼與PriorityQueue是多餘的。雖然...

此代碼不起作用,因爲您沒有正確連接elem在您的最後一種情況(第二個最後關閉之前的代碼塊支撐)。

嘗試添加這是塊結束,就在那些接近括號:

elem.prev.next = elem; 
+0

哇。 ty,那解決了它。 我很震驚,它確實很容易。 是的,我目前正在瞭解隊列,並希望至少實施一次基礎知識。 – Imago

+0

我很高興解決了這個問題,但請記住,對於「真正的代碼」(是:你打算使用的東西,而不是從中學習),通常使用標準庫會更好。「PriorityQueue」不僅比這個代碼更經過測試,而且效率更高(儘管名稱優先級隊列與普通隊列有很大不同)。 –

-1

爲什麼不乾脆用java優先級隊列,這將完成大部分的工作進行的,並是非常優化你在這裏有什麼