2016-09-22 12 views
0

これはホワイトボード化されており、メモリ不足エラーが発生する理由を理解できないようです。このプロジェクトは、リンクされたリストとそのメソッドのいくつかをゼロから作成することです。私の他の機能は良いですが、このスワップ機能は私に多くの問題を与えています。スワップメソッドのトラブルシューティング 'from scratch' Javaのリンクリスト

デバッガを実行すると、プログラムはpj.nextNodeLink = p.nextNodeLinkでクラッシュします。スワップ関数は、2つのint入力を取り、それらの値を入れ替えることになっています。 nextNodeLinkポインタを変更しようとしていましたが、明らかに失敗しています。どんな助けでも大歓迎です!あなたのコードがどのように動作する

public void swapByIndex(int firstIndexValue, int secondIndexValue){ 
    if(firstIndexValue<0 || secondIndexValue<0 || firstIndexValue>size-1 || secondIndexValue>size-1) { 
     throw new ArrayIndexOutOfBoundsException(); 
    } 
    else if(head == tail){ // Case one - only one element in list 
     System.out.println("The list only has one element. Nothing to swap. "); 
    } 
    else{ // Case Two - two or more elements 
     //keep a pointer to the next element of head 
     Node firstPointer = head; 
     Node firstSwapElement = firstPointer; 
     for(int k=0; k<firstIndexValue; k++){ 
      firstSwapElement = firstPointer; // save the node P is on into 'previ' node 
      firstPointer = firstPointer.nextNodeLink; // P iterates to next node 
     } 

     Node secondPointer = head; 
     Node secondSwapElement = secondPointer; 
     for(int k=0; k<secondIndexValue; k++){ 
      secondSwapElement = secondPointer; 
      secondPointer = secondPointer.nextNodeLink; 
     } 

     Node secondNodeSave = secondPointer; // save this so we have the correct next node link for second swap 

     secondPointer.nextNodeLink = firstPointer.nextNodeLink; 
     firstSwapElement.nextNodeLink = secondSwapElement; 
     firstPointer.nextNodeLink = secondNodeSave.nextNodeLink; 
     secondSwapElement.nextNodeLink = secondPointer; 

    } 
} 
+1

まあ私は混乱しています。 "pkはj変数を保持しています" ...おそらくあなたの命名規則をクリーンアップすると、実際のエラーを見つけやすくなります... – John3136

+0

ポイントを獲得しました。コードを更新しました。 –

+0

スワップを実行しているときには、単にa = bを実行することはできません。 b = a; 'またはそれらはちょうど同じ値になります - 値の1つを最初に一時変数に入れる必要があります。 'tmp = a; a = b; b = tmp; ' –

答えて

0

- ではなく、実際に次のポインタを再配置することによって、ノード自身を交換しようとしているのは、私は単に一時変数を使用して値をスワップ。

public void swapByIndex(int firstIndexValue, int secondIndexValue){ 
    if(firstIndexValue<0 || secondIndexValue<0 || firstIndexValue>size-1 || secondIndexValue>size-1) { 
     throw new ArrayIndexOutOfBoundsException(); 
    } 
    else if(head == tail){ // Case one - only one element in list 
     System.out.println("The list only has one element. Nothing to swap. "); 
    } 
    else{ // Case Two - two or more elements 
     //keep a pointer to the next element of head 
     Node firstSwapElement = head; //THIS IS THE FIRST ELEMENT! 
     Node previousFirstSwapElement = firstSwapElement; 
     for(int k=0; k<firstIndexValue; k++){ 
      previousFirstSwapElement = firstSwapElement; // save the node P is on into 'previ' node 
      firstSwapElement = firstSwapElement.nextNodeLink; // P iterates to next node 
     } 

     Node secondSwapElement = head; 
     Node previousSecondSwapElement = secondSwapElement; 
     for(int k=0; k<secondIndexValue; k++){ 
      previousSecondSwapElement = secondSwapElement; 
      secondSwapElement = secondSwapElement.nextNodeLink; 
     } 

     Integer temp = (Integer)secondSwapElement.data; 
     secondSwapElement.data = firstSwapElement.data; 
     firstSwapElement.data = temp; 

    } 
} 
0

- AとBのノードあなたが交換したい。:

Say initially you had, A - a - a2.... B - b- b2 

b.next = a.next; // b - a2 
A.next = B; // A - B 
a.next = secondNodeSave.next; // a - b2 
B.next = b; // B - b 

、それがどのように見えるのすべての組み合わせ:期待しながら、

A - B - b - a2 - ? 
a - b2 - ? 

は次のとおりです。

B - a - a2.... A - b- b2 

変数のロジックとプレースメントスワッピング操作のために完全にねじ込まれている。 a2またはb2を気にする必要はありませんが、文脈上は関係ありません。

正しいアプローチ:

aPre - A - aNext ..... bPre - B - bNext 

aPre->next = B 
B->next = aNext 
bPre->next = A 
A->next = bNext 
0

私は自分のコードを編集しています。ちょうどそれを実行し、あなたの問題を解決します。あなたはノードの交換で間違いを犯していました。異なる戦術を使用して終了

public void swapByIndex(int firstIndexValue, int secondIndexValue){ 
      if(firstIndexValue<0 || secondIndexValue<0 || firstIndexValue>size-1 || secondIndexValue>size-1) { 
       throw new ArrayIndexOutOfBoundsException(); 
      } 
      else if(head == tail){ // Case one - only one element in list 
       System.out.println("The list only has one element. Nothing to swap. "); 
      }else 
       if(firstIndexValue==secondIndexValue) 
        { 
        System.out.print("Both are pointing to same index, no need to swap"); 
        } 
      else{ // Case Two - two or more elements 
       //keep a pointer to the next element of head 
       Node firstPointer = head; 
       Node firstSwapElement = firstPointer; 
       for(int k=0; k<firstIndexValue; k++){ 
        firstSwapElement = firstPointer; // save the node P is on into 'previ' node 
        firstPointer = firstPointer.nextNodeLink; // P iterates to next node 
       } 

       Node secondPointer = head; 
       Node secondSwapElement = secondPointer; 
       for(int k=0; k<secondIndexValue; k++){ 
        secondSwapElement = secondPointer; 
        secondPointer = secondPointer.nextNodeLink; 
       } 

       Node secondNodeSave = secondPointer; // save this so we have the correct next node link for second swap 

       secondPointer.nextNodeLink = firstPointer.nextNodeLink; 
       firstSwapElement.nextNodeLink = secondPointer; 
       firstPointer.nextNodeLink = secondNodeSave.nextNodeLink; 
       secondSwapElement.nextNodeLink = firstPointer; 

      } 
     } 
+0

これはまだメモリ不足です。 –