2017-04-21 9 views
1
 /* 
DEFINITIONS 

public class ListNode { 
     int val; 
     ListNode next; 
     public ListNode(int x){ 
      val = x; 
      next = null; 
     } 

    } 


    public class LinkedList { 
     ListNode head; 
    } 
    */ 


    public void removeDups(){ 
     ListNode head = this.head; 
     if(head == null) return; 

     HashSet<ListNode> set = new HashSet<>(); 
     set.add(head); 
     while(head.next != null){ 
      if(set.contains(head.next)){ 
       head.next = head.next.next; 
      } else{ 
       set.add(head.next); 
       head = head.next; 
      } 
     } 
    } 

私はソートされていないリストから重複を削除するはずですが、Javaでは機能していません。リンクリストから重複を削除できないのはなぜですか?

1->2->4->9->9->41->2->4->9返すが、それはまだ

問題は何である1->2->4->9->9->4を返す必要がありますか?私は明らかにすべてのノードをハッシュセットに挿入し、それが含まれているかどうかをチェックしていますが、何が起きているのかは不明です。

答えて

6

投稿したコードの重複ノードではなく、重複ノードを削除しています。

/* 
DEFINITIONS 

public class ListNode { 
    int val; 
    ListNode next; 
    public ListNode(int x){ 
     val = x; 
     next = null; 
    } 

} 


public class LinkedList { 
    ListNode head; 
} 
*/ 


public void removeDups(){ 
    ListNode head = this.head; 
    if(head == null) return; 

    HashSet<Integer> set = new HashSet<Integer>(); 
    set.add(head.val); 
    while(head.next != null){ 
     if(set.contains(head.next.val)){ 
      head.next = head.next.next; 
     } else{ 
      set.add(head.next.val); 
      head = head.next; 
     } 
    } 
} 
1

あなたはsetListNodeが含まれていますが、あなたはListNodeクラスのequalsメソッドをオーバーライドしていないかどうかを確認しようとしています。それを上書きするか、ノード全体ではなく、値を設定して追加してください。値は単純な整数なので動作します。

equalsをオーバーライドするときは、必ずやるべきのようにしても、hashCodeメソッドをオーバーライドする必要があります - 正しく、それが現在動作しない理由を説明し感謝アンディ・ターナー

+0

OPは 'HashSet'を使用しているので、同じ値を持つノードが比較されないこともあるので、hashCode()もオーバーライドする必要があることに注意してください。もちろん、両方を上書きする必要がありますが、明示的に述べる価値があります。 –

1

だけv78's answerに追加する、:

int hashCode() { return val; } 

boolean equals(Object other) { 
    if (other == this) return true; 
    return (other instanceof ListNode) 
     && val == ((ListNode) other).val; 
} 
0:

また、あなたは彼らが同じvalを持っている場合、ノードは等しいと見なされることができるでしょうListNodeクラスにequalshashCodeを実装することができ

関連する問題