2013-03-27 60 views
0

我做了我自己的Node類和我自己的LinkedList類,我想建立一個函數來計算我的LinkedList中有多少個不同的節點。如何統計我的鏈表中有多少個不同的節點?

我曾嘗試與此代碼,但它不工作:

for (int i = 0; i < quantityOfNode(); i++) { 
    boolean isDistinct = true; 

    for (int j = 0; j < i; j++) { 
     if (node.getInfo().equals(node.getNext().getInfo())) { 
      isDistinct = false; 
     } 
    } 
    if (isDistinct) { 
     nbDistinct++; 
    } 
    if (node.getNext().getNext() != null) { 
     node= node.getNext(); 
    } 
} 

爲例:

 list.add(3); 
    list.add(2); 
    list.add(5); 
    list.add(3); 
    list.add(3); 
    list.add(8); 

這是supose給我4個不同的節點,但我得到5,因爲節點3被計數2次

現在我已經嘗試在第j個循環中使用第二個節點,並且爲相同的輸入現在給我2而不是4

這裏是新的代碼我試過,但仍不能工作:

  for (int i = 0; i < quantityOfNode(); i++) { 
      boolean isDistinct = true; 
      for (int j = 0; j < i; j++) { 
       if (node.getInfo().equals(node2.getInfo())) { 
        isDistinct = false; 

       } 

       if (node2.getNext() != null) { 
        node2 = node2.getNext(); 
       } 

      } 
      if (isDistinct) { 
       nbDistinct++; 
      } 
      if (node.getNext() != null) { 
       node= node.getNext(); 
      } 
     } 
+3

以何種方式它不工作?給出一個輸入和預期輸出以及實際輸出的例子。 – Patashu 2013-03-27 23:10:49

+0

'length()'方法做了什麼? – 2013-03-27 23:12:52

+0

list.add(3); \t \t list.add(2); \t \t list.add(5); \t \t list.add(3); \t \t list.add(3); \t \t list.add(8); 我有4個不同的節點,但我得到5 – pharaon450 2013-03-27 23:13:11

回答

1

j循環沒有踏node前開始i - 它總是比較相同的一對節點,因此沒有任何功能。

你需要的東西,如:

... 
Node earlierNode = rootNode; 
for (int j = 0; j < i; j++) { 
    if (earlierNode.getInfo().equals(node.getInfo())) { 
     isDistinct = false; 
    } 
    earlierNode = earlierNode.getNext(); 
} 
... 
+0

對,我怎麼能讓我的j循環工作plz? – pharaon450 2013-03-27 23:36:50

+0

@ pharaon450 - 增加了建議。 – OldCurmudgeon 2013-03-27 23:41:13

+0

謝謝你,我還在嘗試它仍然不工作:(也許有一種方式,我可以與你聊天,即時通訊新的到這個網站 – pharaon450 2013-03-27 23:47:09

0

使用設置

Set<Node> mySet = new HashSet<Node>(list); 
answer = mySet.size(); 

這取決於你實施的hashCode並在節點級等於,或者你可以使用TreeSet的和一個比較器。

Comparator<Node> myComparator = new MyCustomComparator();// you have to define your comparator. 
Set<Node> mySet = new TreeSet<Node>(myComparator); 
mySet.addAll(list); 
answer = mySet.size(); 
+0

即時對不起,我不知道設置,所以我不能使用它,但謝謝 – pharaon450 2013-03-27 23:30:26

2

您可以使用Set。

Set set = new HashSet(); 
Node cur = list.head; 
while(cur != null) { 
    set.add(cur.getInfo()); 
    cur = cur.getNext(); 
} 
return set.size(); 

這不使用泛型,因爲我不知道你有什麼類型的getInfo。或者,如果你不能使用一個集合,你應該嘗試擺脫你的'索引'變量(我和j)。你真的想把你的應用邏輯集中在你實際擁有的東西上,而不是隱式計算的值。當您的當前節點變爲空時,而不是當您提前一定次數時,您希望停止。如果這不合邏輯,請告訴我。

對於每個節點,檢查之前的節點以查看該節點是否存在。我每次都從頭開始,因爲我不知道你是否有雙重鏈接。無論哪種方式都是相同的複雜性,但是在排序列表中,這是不太理想的。

Node cur = list.head; // for each node 
int nbDistinct = 0; 
while(cur != null) { // go until we're out of nodes 
    Node check = list.head; // check the first node 
    boolean isDistinct = true; // assume distinct 
    while(check != cur && isDistinct) { // stop if we found a match OR if our checker caught up to our current node 
     isDistinct |= !check.getInfo().equals(cur.getInfo()); // essentially "if(check.getInfo().equals(cur.getInfo()) isDistinct = true;" 
     check = check.getNext(); // advance the checker 
    } 
    if(isDistinct) nbDistinct++; 
    cur = cur.getNext(); // advance the current node 
} 
+0

對不起,我不知道設置所以即時嘗試不使用它,但謝謝 – pharaon450 2013-03-27 23:28:37

+0

我也有一個替代解決方案,與評論。 – corsiKa 2013-03-27 23:31:01

+0

我會試一試謝謝你,但你能告訴我爲什麼我應該停止當我找到一場比賽?我的目標是要知道我的鏈表中有多少個不同的節點 – pharaon450 2013-03-27 23:36:00

2

第一個問題:

如果你的for循環寫過這樣,它並沒有結束鏈表的長度去:你爲什麼需要這個

for (int i = 0; i < length(); i++) {

呢?

  if (node.getNext().getNext() != null) { 
       node= node.getNext(); 
      } 

特別是,這種代碼可能意味着剛剛結束節點之前兩次評估,因爲超越它的節點是null。它不一定會讓你的算法錯誤,但它味道不好,我不喜歡它。

問題二:

  for (int j = 0; j < i; j++) { 
       if (node.getInfo().equals(node.getNext().getInfo())) { 
        isDistinct = false; 
       } 
      } 

這是計算重複,因爲你不存儲和推進你是比較反對的第二個節點的位置的錯誤方式。嘗試類似

  Node node2 = firstNode(); //idk what method gets the first node :) 
      for (int j = 0; j < i; j++) { 
       if (node.getInfo().equals(node2.getInfo())) { 
        isDistinct = false; 
        break; //optimization, stop as soon as we find a duplicate 
       } 
       node2 = node2.GetNext(); 
      } 

最後,每當面臨碼不起作用,附加一個調試器,通過它一步,當代碼不會做你希望它是什麼注意。這將通過少量觀察快速解決所有邏輯錯誤。即使您無法訪問調試器,也可以使用print語句來打印各種變量的值,並在某些代碼分支執行時進行比較,並與您預期的情況進行比較。

+1

他使用double for循環來比較每個元素與每個其他元素。 – corsiKa 2013-03-27 23:17:00

+1

@corsiKa他只檢查列表中比當前節點更早的節點,以便正確計數重複節點的第一個實例並跳過所有其他節點。另外,它沒有工作,因爲它沒有第二個節點,它通過列表前進,它只是比較節點和它的下一個節點。 – Patashu 2013-03-27 23:18:37

+0

@Patashu所以你建議我爲我的j循環添加另一個節點? – pharaon450 2013-03-27 23:22:54

0

你周圍的i循環您j循環第一次不執行任何操作(因爲它從0開始,並繼續同時j < i它不是),所以你離開distinct設置爲true沒有任何與任何比較。

嘗試在1

+1

你誤解了第二個循環的意思 - 它是爲了看看這個節點在列表中是否有重複的EARLIER。你的建議會使每個節點都與自身比較,所以沒有節點會被認爲是非重複的。, – Patashu 2013-03-27 23:23:47

+0

@Patashu確切地說是 – pharaon450 2013-03-27 23:25:53

+0

你還是在第一次增加'nbDistinct'而不用與任何東西進行比較。 – OldCurmudgeon 2013-03-27 23:26:44

相關問題