2016-05-03 12 views
1

javaのリンクリストで2つのノードを切り替えようとしましたが、問題が発生しています。私のソートアルゴリズムは、ノードの内容を切り替えることでチェックしたところ、正しく動作しますが、ノード自体を切り替えようとすると問題が発生します。リンクリスト内のノードを切り替える際に問題が発生するjava

次は私のノードのスイッチコードです:このコードで

   Node tmp = current; 
       tmp.next = current.next.next; 

       Node tmp2 = current.next; 
       tmp2.next = current; 


       current.next = tmp; 
       current = tmp2; 

しかし、私のループはので、私は私のスイッチングロジックに問題があると確信してループを保持します。誰かがこれを理解するのを助けることができたら、私はそれを高く評価します。

**明確にするために:私はcurrentとcurrent.nextを切り替えることを目指しています。

ありがとうございました!

+0

2つのノードを切り替えようとしていますか? – Samuel

+0

私はcurrentとcurrent.nextを切り替えることを目指しています – user3105072

+0

私は大学でこれをやりましたが、私が交換したい最初の 'node'の前に' node'をつかんでいました。この時点で、次の3つの 'nodes'を正しくリンクするだけです。 – robotlos

答えて

0
Node tmp = current; 
tmp.next = current.next.next; 

上記のコードは、最初に現在のノードを取得し、tmpを指し示します。次に、tmpの次を変更します。問題は、同じことを指しているので、currentも変わるということです。

Node tmp = current.next.next; 
current.next.next = current; 
current.next = tmp; 
+0

を何らかの理由でコピーすると仮定しました。現在はどこに設定していますか? – user3105072

0

このコードを試してみてください。

はあなたのような何かをしたいです。私は若干異なる命名規則を使用していますが、コードはcurrentとにノードをスワップしています。

Node head = current.next; // the node to become the start of the list (may be null) 

if (head != null) { 
    // swap current node's position 
    current.next = head.next; 
    head.next = current; 

    // update the node current is pointing to 
    current = head; 
} 

が視覚的にこれは何が起こっているかである:

Current -> B -> Rest of List...あなたはほとんどそこにいるB -> Current -> Rest of List...

1

になります。私が大学でこれをしたとき、2つのノードを交換するために、交換したい最初のノードの前にあるノードをつかみたい。例えば。あなたがここに

----> currNode -> node_A -> node_B -> node_C ------>

を持っている場合我々はnode_BcurrNode.nextを設定する必要がありますので、私たちはcurrNodeで停止node_Anode_Bと交換することを望みます。これに続いて

は、我々は(私はそれはいくつかのメソッドに渡されるだろうと仮定しています)、次います

Node tmp = curr; 
Node A = curr.next; 
Node B = curr.next.next; 
Node C = curr.next.next.next; 

は今、私たちは物事を正しく設定する必要があります。

tmp.setNext(B); //Now we have ----> tmp -> B 
B.setNext(A); //Now we have ----> tmp -> B -> A 
A.setNext(C); //Now we have ----> tmp -> B -> A -> C ---> 

node_Aは、最初のノードであることを起こるかnode_Bが最後のノードであることを起こるならば、お奨めは、あなたが心に留めておきたいかもしれませんそこにいくつかの追加の条件があるなら。
node_Aがあなたのリンクリストの最初のノードであることを起こる場合は伝えることができ、あなたのようなチェックのためにいくつかを持つことができます。

public void swap (NodeStructure nodeStructure, Node Node_A, Node Node_B){ 
    Node A = Node_A; 
    Node B = Node_b; 
    if(nodeStructure.head == A){ 
     //Node A is the first Node, so we need to handle it in a special way. 
     Node tmp = Node_A; 
     nodeStructure.setHead(B); //Now we have -> B 
     B.setNext(tmp);   //Now we have -> B -> A 
     A.setNext(C);    //Now we have -> B -> A -> C ------> 
    } 

    //or in the case of the tail 

    if(nodeStructure.tail == B){ 
     //Node B is the last Node, in this case, we don't need node_C 
     /*Iterate through nodeStructure until you reach node before A and 
     assign this to tmp.*/ 
     nodeStructure.setTail(A); //Let's set the tail first 
     tmp.setNext(B); //Now we have ----> tmp -> B 
     B.setNext(A); //Now we have ----> tmp -> B -> A 
    } 

    /* Depeding on how you decide to implement, you might also have a third 
     condition checking if Node_A is the head and Node_B is tail.*/ 

    //Handle condition where there's no special cases. 
} 
+0

何らかの点でノードc = curr.next.next.next行が何らかの理由でヌルポインタ例外をスローすると、そのノードは正常に動作しません – user3105072

+0

@ user3105072、あなたはノードが存在すれば特別な条件があることを覚えておかなければなりませんスワップしようとするのは最初と最後のどちらかです。例外がスローされている場合は、node_Bが最後のノードであることを意味します。どの時点でnode_Cは必要ありません。 – robotlos

+0

私はまだすべてをまとめておくのに問題があります。あなたは現在のcurrent.nextを変更するためにプラグインできるコードを使って答えを編集できますか? – user3105072

0

は、[OK]を、私はついにそれを考え出しました!

私はそれをすべて間違っていました。それは単に再リンクの問題でした。以下は、私の解決策だった:

   Node temp = current; 
       Node prevNext = prev.next; 
       Node currentNext = current.next; 
       Node currentNextNext = current.next.next; 


       current.next.next = temp; 
       current.next = currentNextNext; 
       prev.next = currentNext; 

が、それは私がしたように身動きが取れないかもしれない、誰に役立ちます願っています!

関連する問題