2012-03-14 3 views
1

再帰を使用するLinkedListのメソッドをいくつか作成する必要があります。 私は良いですが、これは私に迷惑を与えているものの一つであることをいくつか持っている:再帰検索(Tデータ)メソッドがLinkedListのサイズを変更しています...それを止めますか?

public boolean find(T data){  
    if(head == null) 
     return false; 
    else{ 
     if(head.data == data) 
      return true; 
     else{ 
      head = head.next; 
      return find(data); 
     } 
    } 
} 

LinkedListの中の要素を見つけることになったが、問題は、リストが追加されるべきではないですが、これを明らかに私の頭の位置が増えています。 プロトタイプは、1つのパラメータ、データ1を持つと想定されています。どのように頭の位置を増やすのをやめさせることができますか?

+0

これは[tag:java]です。 –

答えて

2

現在のノードとは別の参照を維持する必要があります。 headを使用しないでください。私はヘルパーメソッドを使ってこれを行います。

public boolean find(T data){  
    return find(data, head); 
} 

private boolean find(T data, Node current) { 
    if (current == null) return false; 
    if (current.data.equals(data)) return true; 
    current = current.next; 
    return find(data, current); 
} 

.equals()代わりに==の使用data値を比較します。私はheadがクラスNodeであると仮定しました。正しい推測ではない場合は、実際のクラスが実装されているものを入力してください。

+0

equals()は違いがありますか? – user1267952

+0

一般的には:はい。しかし、どのような具体的なタイプ「T」に依存しますか。 'T'が' .equals() 'をオーバーライドしないクラスであれば、違いはありません。 http://stackoverflow.com/questions/7520432/java-vs-equals-confusion –

+0

大丈夫を参照してください。また、私は最初のメソッドの妥当性が何であるか分かりません。その2番目のものでは、最初のものは必要ないと思われます。 – user1267952

0

あなたの要件が厳密に再帰を使用していない限り、リストをトラバースするために繰り返しを使用することをお勧めします。再帰は不必要な関数スタックを作成する点で非効率的です。

再帰は、非線形トラバーサルまたはデータ構造のコードを単純化するのに便利です。

繰り返しを使用した場合のコードは次のようになります。

public boolean find(T data) { 

    boolean found = false; 
    T current = head; 

    while(current != null) { 

     if(current.data.equals(data)) { 

      found = true; 
      break; 
     } 

     current = current.next; 
    } 

    return found; 
} 
関連する問題