2016-04-17 3 views
0

リンクリストの最初のK個のノードを逆順にするコードを書いています。Reversing first K nodes of Linked List,Why recursion executing twice for last iterationで解決された問題がありました。今は期待されていますが、変数を使用しようとするとリンクリストにループする"if"条件で "presentCounter"の代わりに "k"を指定した場合、その理由は何ですか?それを避ける方法は?再帰における変数の使用

/* 
* Condition K <= Length of linked list. 
* node = null 
* nextNode headNode of the linked list 
*/ 

public void reverseNode(Node node, Node nextNode, int k) { 

    int presentCounter = k; 
    if (k > 1) { 
     k = k - 1; 
     this.reverseNode(nextNode, nextNode.next, k); 
    } 

    if (presentCounter == 1) { 
     this.kNode = nextNode.next; // Saving K's Next Node 
     this.headNode = nextNode; // Setting K node as head node 
    } 
    if (node == null) { 
     nextNode.next = this.kNode; 
    } else 

     nextNode.next = node; 
} 

答えて

0

presentCounterは、最後の要素がif (presenceCount == 1)であることを確認するために後で使用されるため、使用されます。あなたは単純にkを取り除くと、今presentCounterが減らされているので、代わりに

if (presentCounter > 1) { 
    presentCounter = presentCounter - 1; 
    this.reverseNode(nextNode, nextNode.next, presentCounter); 
} 

presentCounterを使用する場合は
、スワップへの最後の要素のチェックは、前の項目をトリガします。最初の3つの要素を交換するために要求された場合、リスト[a b c d]、例えば

、チェックがthis.kNodedなるようにcため真でなければなりません。
の代わりに、前のステップであるbの場合は、this.kNodec(頭はbに設定されています)。
逆の順序で要素を連結(CBA)、はthis.kNodeに連結されている古いヘッドので、我々は、2つの異なる結果に終わる:

  • Corretthis.kNodedと
    CBAD

  • 不正this.kNodeがCある)
    C B C B ...

第一方がループです。あなたは簡単に、より良い何が起こっているかを理解するために

if (presentCounter > 1) 
    this.reverseNode(nextNode, nextNode.next, presentCounter-1); 

かかわらkを取り除くことができます
、ここでの画像です。

トラバースフェーズ (再帰呼び出しが行われたとき)と構築フェーズ(再帰呼び出しが 呼び出しが戻ったとき)の2つのフェーズがあることを理解しておく必要があります。
それぞれの呼び出しは2回描かれます。

PCが最初の呼び出しすなわち、presentCounter

traversing phase

building phase


するための第1の要素、nodeヌルときnextNodeに保存されたものを意味し関数の

0

kが2である場合、それは再帰は、それが次に続けるを終了した後、それは、Kをデクリメントし、

を再帰その後する最初の条件(K> 1)

に入りますライン。 k = k-1は1を与えるので、if(k == 1)は同じパスでその第2の条件付きのアクションを実行する。

kをpresentCounterに保存してから1つを減算してpresentCounter == 1をチェックすると、この余分なタスクは2回実行されなくなります(今度はk == 1であるため再帰呼び出し内で1回、 )。

関連する問題