2

整数の 1 つのリンク リストと、分割値と呼ばれる特別な値で始まるメソッドを作成する必要があります。リストの要素は順不同です。このメソッドは、ノードを 2 つのリンクされたリストに分割します。1 つは分割値より小さい要素を含むすべてのノードを含み、もう 1 つは他のすべてのノードを含みます。元の連結リストに整数の繰り返し (つまり、同じ要素を持つ 2 つ以上のノード) がある場合、この要素を持つ新しい連結リストには、この要素を繰り返す同じ数のノードが必要です。このメソッドは、作成されたリンク リストごとに 1 つずつ、2 つのヘッド参照を返します。

これを正しく行うために数えきれないほどの時間を費やしてきましたが、これが最も近いと思いますが、コンパイル中に copyTail* IntNodes が初期化されていない可能性があるというエラーが発生しました。私も自分のコードに完全に間違っているかもしれません....正しい方向に私を指し示す助けはありますか??

public static IntNode[ ] listSplitLessGreater(IntNode source, int splitter)
{
  IntNode copyHeadLess;
  IntNode copyTailLess;
  IntNode copyHeadGreater;
  IntNode copyTailGreater;
  IntNode[ ] answer = new IntNode[2];
    boolean less = true;
    boolean greater = true;

  // Handle the special case of the empty list.   
  if (source == null)
     return answer; // The answer has two null references .

  //Split list into two lists less and greater/equal than splitter.     
  while (source.link != null)
  {
    if (splitter < source.data)
        {
            if (less)
            {
            copyHeadLess = new IntNode(source.data, null);
            copyTailLess = copyHeadLess;
            less=false;
            }
            else
            {
            source = source.link;
            copyTailLess.addNodeAfter(source.data);
            copyTailLess = copyTailLess.link;

            }
        }
        else
        {
            if (greater)
            {
            copyHeadGreater = new IntNode(source.data, null);
            copyTailGreater = copyHeadGreater;
            greater=false;
            }
            else
            {
            source = source.link;
            copyTailGreater.addNodeAfter(source.data);
            copyTailGreater = copyTailGreater.link;

            }
        }

    }      

  //Return Head References
  answer[0] = copyHeadLess;
  answer[1] = copyHeadGreater;

  return answer;

}

4

2 に答える 2

3

IntNode単一のクラス ( )だけでリストをモデル化することで、必要以上に複雑にしていると思います。「リスト」および「リスト内のノード」としてモデル化すると、のリストを持つのは簡単です。また、頭と尾の両方を追跡する必要はありません - リストはそれを行うことができます。その時点で、それは非常に簡単です:

  • 2 つの空のリストを作成します。1 つは「下」用で、もう 1 つは「下ではない」用です。
  • 元のリストを反復処理します。
    • 要素を追加するリストを決定する
    • 要素を追加する
  • 両方のリストを返します (例: 配列を使用)

nullそれがなくても、 「私はまだこのリストを取得していません」という意味で使用するだけで、コードを簡単にすることができます。現時点では、copyHeadLessetc は使用時に確実に割り当てられないため、コードはコンパイルされません。それらが割り当てられるまでそれらを使用しようとしないことはわかっていますが、コンパイラはそうしません私はまだ改造アプローチをお勧めします:)

于 2012-05-03T06:14:58.030 に答える
2

source が null ではなく、source.link が null (リストが 1 つの要素のみで構成されている) の場合、copyHeadLess などの変数に割り当てることはありません。それらを null またはデフォルトの値に初期化してみてください。

  IntNode copyHeadLess = null;
  IntNode copyTailLess = null; 
  IntNode copyHeadGreater = null; 
  IntNode copyTailGreater = null; 
  IntNode[ ] answer = new IntNode[2]; 
    boolean less = true; 
    boolean greater = true; 

  // Handle the special case of the empty list.    
  if (source == null) 
     return answer; // The answer has two null references . 

  //Split list into two lists less and greater/equal than splitter.      
  while (source.link != null) 
  { 
    // what about case where source isn't null but source.link is null?
  }       

  //Return Head References 
  answer[0] = copyHeadLess; // this may have never been assigned in your original code
  answer[1] = copyHeadGreater; // this may have never been assigned in your original code

  return answer; 

 }
于 2012-05-03T06:16:05.327 に答える