2012-12-01 62 views
0

我想追加到鏈接列表中,但不重複值。這是我的功能:但是這不會過濾出重複。任何想法,我哪裏錯了?節點由一個字符串值和一個下一個指針組成。在java中的單個鏈接列表中追加唯一值

public static void append(Node head, Node newNode) { 
    Node currentNode = head; 
    while(currentNode.next != null) { 
     if(currentNode.value.trim().equals(newNode.value.trim())) { 
     return; 
     } 
     currentNode = currentNode.next; 
    } 
    currentNode.next = newNode; 
} 
+1

你可以發佈一個簡短,但*完整的*程序,它演示了這個問題? –

回答

1

您從不檢查最後一個重複節點。

在將來找到這樣的問題的最佳方法是在調試器中逐步執行代碼,而不是在論壇上提問。否則,你將永遠無法學習自己的代碼。

+0

是的這有效!謝謝。 –

3

你並沒有檢查最後一個重複節點(正如jtahlborn在他的回答中所說的,當我開始寫這個時,它被刪除了......)。您需要繼續前進,直到currentNode爲空,但您需要記住上一個節點,以便您可以使用它作爲尾節點。

下面是一個簡短但完整的程序,顯示它的工作。它有討厭的包訪問字段等,但它的工作原理...

class Test { 
    public static void main(String[] args) { 
     Node head = new Node("head"); 
     append(head, new Node("foo")); 
     append(head, new Node("bar")); 
     append(head, new Node("bar")); 
     append(head, new Node("bar")); 
     append(head, new Node("baz")); 
     dump(head); 
    }   

    public static void append(Node head, Node newNode) { 
     Node currentNode = head; 
     Node previousNode = null; 

     while (currentNode != null) { 
      previousNode = currentNode; 
      if (currentNode.value.trim().equals(newNode.value.trim())) { 
       return; 
      } 
      currentNode = currentNode.next; 
     } 

     previousNode.next = newNode;   
    } 

    public static void dump(Node head) { 
     Node currentNode = head; 

     while (currentNode != null) { 
      System.out.println(currentNode.value); 
      currentNode = currentNode.next; 
     } 
    } 
} 

class Node { 
    String value; 
    Node next; 

    Node(String value) { 
     this.value = value; 
    } 
} 
+0

這可能是一個門檻問題,但爲什麼不只是添加到最新= newNode? – dreamcrash

+1

@dreamcrash:你爲什麼期待幫忙?改變局部變量'currentNode'的值不會改變尾部的'next'節點... –

+0

好的,我明白了,因爲current將等於null – dreamcrash