2016-09-27 4 views
1

再帰を使用してリンクリストの最後にノードを挿入しています。コードは正常に動作します。しかし、私はリターンステートメントと少し混乱しています。 -再帰を使用する場合のreturn文の混同

を二を行うにはより多くの何もで作成されたノードを返しません

最初のリターンは、新しいノードhead == nullと機能が終了します返します。私の理解の一つ一つを通って行く

末尾は何もしません。

最後に、insertNodeAtTailが再帰的に呼び出されるたびに、すべてのノードがスタックに置かれます。 2回目の返品がhead.next == nullと呼び出されたとき。すべてのノードが最初のノードに到達するまでスタックからポップされます。リンクされたリストの最初のノード(頭を指す)として効果的です。

私の理解は正しいですか?

public Node insertNodeAtTail(Node head, int data) { 
    if(head == null) { 
    /* List is empty so just return the new node */ 
     Node node = new Node(); 
     node.data = data; 
     node.next = null; 
     return node; 
    } 
    else if (head.next == null) { 
    /* We are at the end of the list so insert the new node */ 
     Node node = new Node(); 
     node.data = data; 
     head.next = node; 
     return head; 
    } 
    else { 
    /* Travese the list by passing the next node in the list until next is NULL */ 
     insertNodeAtTail(head.next, data); 
    } 

    /* This will put all the head nodes on the stack and then pop them off at the end */ 
    return head; 
} 

任意の提案のための多くのおかげで、

+0

を行います。戻り値のポイントが何であるか分かりません。使用されていません。 – Zarwan

+0

@ Zarルートノードは常に返されるので、何かが追加されるたびにルートノードを取得するのはおそらく存在します。 – EvilTak

+0

最初のケース( 'head == null')はListに何も追加しません(つまり、あなたのメソッドによって返されたNodeをListの' head'メンバーに代入しない限り)あなたのメソッドは空のリストでは機能しません) – Eran

答えて

3

単にはい、ご理解が正しいか、この

public Node insertNodeAtTail(Node head, int data) { 
if(head == null) { 
    head = new Node(data); 
} 
else{ 
    head.next = insertNodeAtTail(head.next,data); 
} 
return head; 
} 
+0

私はreturn文をelse文の中に移動し、コードは正常に動作します。私はそれが動作することを知っているしかし、head.next = insertNodeAtTail(head.next、data)とまだ混同しています。 insertNodeAtTailは何を返しますか? – ant2009

+1

リストの最後にノードを追加し、最後に頭を返します。 – FallAndLearn

2

あなたは、単に返された同一のヘッド素子を備え、間違った場所にリターンを入れます。

else { 
/* Travese the list by passing the next node in the list until next is NULL */ 
    return insertNodeAtTail(head.next, data); 
} 

私はヘッドからこれを書いてください。

+0

実際には、私はそれを試みましたが、関数はnull例外でクラッシュしました。 – ant2009

1

はい、ご理解が正しいか、それは頭が常にあなたのリストの2番目の最後のノードを指すようになりますよう... :)

1

最終リターンは、問題が発生します。 FallAndLearnで提案されているように削除する必要があります。私が間違っているなら、私を訂正してください。

+0

私の質問で書いた元のコードはテストケースで成功したので、すべてのノードがスタックをポップし、スタックをポップする最後のスタックが最初のものになるため、常に最初の先頭を返します1。頭は最初のノードを指します。 – ant2009

関連する問題