2017-06-08 18 views
-1

このリストから3を削除したいが、どこから開始するのか分からない。私は、リンクリストを実装プライオリティキューに一連の番号を格納し、分を見つけ、LinkedListからminを削除する

import java.util.Iterator; 
import java.util.LinkedList; 
public class Test { 

    static LinkedList<Integer> list = new LinkedList<Integer>(); 

    public static void main(String[] args) { 

     list.add(10); 
     list.add(4); 
     list.add(12); 
     list.add(3); 
     list.add(7); 
     System.out.println(removeMin()); 
    } 

    public static Integer removeMin() { 
     LinkedList<Integer> pq = new LinkedList<Integer>(); 
     Iterator it = pq.iterator(); 

     for (int i = 0; i < list.size(); i++) { 
      pq.add(list.remove()); 
     } 

     int min = pq.get(0); 

     while (it.hasNext()) { 
      // help here 
     } 

     return pq.remove(); 
    } 

答えて

1

これを試してみてくださいremoveMin方法を使用して、プライオリティキューから削除しようとしています:

ソリューション1

LinkedList<Integer> list = new LinkedList<Integer>(); 
     list.add(10); 
     list.add(4); 
     list.add(12); 
     list.add(3); 
     list.add(7); 
     Collections.sort(list); 
     list.removeFirst(); 
     list.forEach(System.out::println); 

解決方法2:

LinkedList<Integer> list = new LinkedList<Integer>(); 
    list.add(10); 
    list.add(4); 
    list.add(12); 
    list.add(3); 
    list.add(7); 

    int min=Integer.MAX_VALUE; 
    int pos=0; 
    int remPos=0; 
    Iterator<Integer> iterator = list.iterator(); 

    while(iterator.hasNext()){ 
     Integer element = iterator.next(); 
     if(element<min){ 
      min=element; 
      remPos=pos; 
     } 
     pos++; 
    } 

    list.remove(remPos); 
    list.forEach(System.out::println); 
+2

私は間違いなくO(n)ランダムアクセス時間でLinkedListをソートしようとしません。 – BladeCoder

+0

ありがとう@BladeCoder。並べ替えを必要としないもう1つの答えを追加しました –

+2

同じパフォーマンスの問題:LinkedListは要素への直接アクセスをサポートしていないため、get(i)はO(n)操作です。それぞれの反復で始まります。代わりにIteratorを使用する必要があります。 – BladeCoder

1

一つの簡単な

list.remove(Collections.min(list)); 
System.out.println(list); // to test 

どのようにこの作品:1行のコードでそれを実現する方法はCollectionsクラスを使用していますか?

  • list.remove(Object o):それが存在する場合、このリストから特定 要素の最初の発生を削除します。このリストに要素を含む がない場合は、変更されません。
  • Collections.min(Collection<? extends T> coll):要素の自然順序付けに従って、指定されたコレクションの最小要素を返します。あなたは、コレクション内の複数の値を持っている場合

さらに、あなたはこのような何かを行うことができます。

final Integer min = Collections.min(list); 
while(list.contains(min)){ // to remove all min value occurrences in list 
     list.remove(min); 
} 
System.out.println(list); // to test 
0

コードはいくつかミスをしています。あなたはpqにリストをコピーしているとき

for (int i = 0; i < list.size(); i++) { 
     pq.add(list.remove()); 
} 

、あなたはlist.size()を使用していますが、あなたはまた、ループ内でリストの要素を削除します。したがって、sizeが減少するため、すべての要素をコピーしません。

また、priority queueを実装していない場合は、listのコピーです。 priority queueを作成するには、要素を順番に挿入する必要があります。 min elementはキューのtopになります(先頭はリストの最初の要素です)。

を削除するには、pq.remove()を実行します。

関連する問題