2017-12-07 10 views
1

JavaのCollection Frameworkを使用せずに2つの一般的なdoubeリンクリストを組み合わせる効率的な方法はありますか?リストはすでにソートされているため、最初のリストに2番目のリストを追加するだけで済みます。これまでのところ私はこの方法を試してみましたが、私は、これは正しいアプローチであるかどうかわからないです:事前にJavas Collection Frameworkを使用せずに汎用リストをJavaで結合(追加)するにはどうすればいいですか?

public void combineWith(List<T> anotherList) { 
    DoubleLinkedList<T> list1 = new DoubleLinkedList<>(); 

    anotherList = new DoubleLinkedList<>(); 


    list1= this; 


    if(this.next==null) { 
     list1.next= (DoubleLinkedList<T>) anotherList; 

    } 

感謝。

+0

両方のリストを組み合わせるのに 'addAll'メソッドを使用できますか? – JTejedor

+1

なぜ新しいリストを作成し、 'list1'に入れてすぐにそれをビンしますか? – phflack

+0

なぜ 'anotherList'パラメータを新しい(空の)リストインスタンスに再割り当てするのですか? –

答えて

0

下記の方法を試してみてください。明らかにこれはDoubleLinkedListクラス内に配置されている場合にのみ機能します。つまり、thisがすでにDoubleLinkedListの場合にのみ可能なlist1 = thisを設定するので、それは私が想定しているクラスです。

firstはDoubleLinkedListの最初の要素(またはノード)であり、lastはDoubleLinkedListの最後の要素(またはノード)です。グローバル変数として保存されていないものを持っていない場合は、そうするか、最初と最後の要素を見つける別の方法を実装します。

public void combineWith(DoubleLinkedList<T> anotherList) { 
     if(anotherList.isEmpty()) return; 
     if(this.isEmpty()){ 
       this = anotherList; 
       return; 
     } 
     this.last.next = anotherList.first; 
     anotherList.first.previous = this.last; 
} 
+0

'anotherList.first.previous'を割り当てる前に' anotherList.first'にいくつかのnull処理を加えるべきでしょう。そうでなければ 'anotherList'が空であればNPEを得るでしょう... –

+0

ありがとう、忘れてしまいました。私はコードを変更しました – Naeramarth

+0

そして、あなたは 'this.isEmpty()'なら単に返す必要はないと思います。代わりに 'this'を' anotherList'に置き換える必要があります。 – Lennier

1

ソート済みリストをマージします。挿入/取り外しを伴う歩行の場合、Iteratorまたはこの場合はListIteratorが便利です。二重リンクリストは、リスト内のポインタによって移動することもできます。

基本的なアルゴリズムは以下のとおりです。ここで

/** 
* Merge this list with another, both are sorted. 
* @param other unchanged list. 
*/ 
public void mergeSorted(List<T> other) { 
    Iterator<T> iter = iterator(); 
    Iterator<T> otherIter = other.iterator(); 
    while (iter.hasNext() && otherIter.hasNext()) { 
     T value = iter.next(); 
     T otherValue = otherIter.next(); 
     int cmp = value.compareTo(otherValue); 
     if (cmp >= 0) { 
      if (cmp > 0) { 
       iter.insert(otherValue); 
      } 
      otherIter.next(); 
     } 
     if (cmp <= 0) { 
      iter.next(); 
     } 
    } 
    while (other.hasNext()) { 
     iter.insert(other.next()); 
    } 
} 

私は同じ要素にスキップします。

ASCIIアートでの私の試み:(この、他)

  • イコール

    : : 
    X = X 
    | | 
    
  • 少ない

    : : 
    X : 
    : \ : 
    : Y 
    | : 
    
  • グレーター

    : : 
    : X 
    :/: 
    Y + 
    : | 
    
関連する問題