1

「RemoveAll」クラスは Linked List クラスの一部です。私が書いたクラスは、Linked List からすべてのキーを削除しますが、重複したキーは削除しません。

理由を知っている人はいますか?重複したキーも削除するにはどうすればよいですか?

public class LinkedIntList {

    private ListNode front; 
    private String name = "front"; 

    // Constructs an empty list.
    public LinkedIntList() {
        front = null;
    }


   public void removeAll(int key){

    if(front == null){ 

         throw new RuntimeException();

       }else if( front.data == (key)) {

      front = front.next;

      return;
   }

     ListNode cur  = front;

     ListNode prev = null;

   while(cur != null  && cur.data != (key) ){

      prev = cur;

      cur = cur.next;
   }

   if(cur == null) 

    throw new RuntimeException();

   
   prev.next = cur.next;

}
4

4 に答える 4

1

重複がある場合、ブルート フォース アプローチは、false が返されるまで removeAll() を呼び出し続けることです。

while (myCollection.removeAll(someOthercollection))
   ;  // comment here that the loop does nothing for clarity

追加: @Dukeling が正しく指摘しているように、これを行う必要はありません。しかし、removeALl() の実装が不十分な場合は、実装する必要があるかもしれません。

于 2013-03-04T01:47:00.070 に答える
1

さて、あなたのメソッドは最初に一致するキーのみを見つけ、その項目をリストから削除しようとしてから戻ります。最初の一致が見つかったら、一致しないキーが見つかるまで(またはリストの最後に到達するまで) ループしてアイテムを削除する必要があります。

于 2013-03-04T01:50:46.693 に答える
0

最初のノードだけでなく、すべてのオカレンスを確実に削除できるように、data == key のときにノードを削除する必要があります。

else if( front.data == (key)) { front = front.next;では、最初の出現のみを削除しています。そのはずwhile ( front.data == (key)) { front = front.next;

ここでも、ノードを1 つだけ削除し ていprev.next = cur.next ます。そうしないと、最初に出現したものだけが削除されます。while cur.data == keyprevcurprev.next = cur.next;

于 2013-03-04T02:23:35.337 に答える