2012-03-14 9 views
1

私はJavaクラスに割り当てられているので、逆順でリンクリストを再帰的に出力する必要があります。私はオンラインで見て、これを行う再帰的メソッドの例をたくさん見つけましたが、パラメータとしてノードをとります。リスト全体を印刷する必要があるので、リンクされたリストを取る必要があります。以下は、私が書いたコードであり、それは再帰的にリストを印刷するという意味では機能しますが、リストを作成したのと同じ順番です。リストを出力した後、そのような要素の例外もスローされません。私の主な問題/質問は、これを再帰的に印刷するにはどのように最善を尽くしているのか、頭を悩ますことです単一リンクリスト宿題の再帰印刷

public void printRecurse2(LinkedList<String> list2) 
{ 
    if(list2 == null) 
     return; 
    System.out.println(list2.pop()); 
    printRecurse2(list2); 

} 
+1

空の 'LinkedList'に' pop() 'を呼び出そうとしているので、' LinkedList' APIから 'removeLast()'を試してみるといいでしょう。 –

答えて

0

あなたlistは再帰が時間内に停止しない理由です、nullになることはありません。リストが空ではなく、nullでないかどうかをチェックする必要があります。

if(list2.peek() == 0) 
    return; 
System.out.println(list2.pop()); 
printRecurse2(list2); 

これは例外を回避します。逆に印刷するには、リストのもう一方の端から開始する必要があります:これは宿題であるため

if(list2.peekLast() == null) 
    return; 
System.out.println(list2.pollLast()); 
printRecurse2(list2); 
+0

これは要素。 –

+0

@NiklasB。、一度に1つ...私の更新をチェックしてください。 –

+0

問題は、単独でリンクされたリストには、リストの最後で動作する操作がないことです。したがって、データ構造の選択としての 'LinkedList'は実際にはここで失敗します。 –

0

、私はあなたに答えを与えていない、あなたをガイドするつもりです。

再帰関数では、再帰を終了するには少なくとも1つの基本ケースが必要です。ベースケースに(list2 == null)を選択しました。各関数呼び出しの最後に、printRecurse2(list2)を呼び出しています。ここで、list2には1つの要素がポップされています。何があっても、list2が存在し、nullと等しくない。 の場合がありますが、が空のとなります。ベースケースを変更することを検討してください。

削除されるアイテムの順序に関しては、pop()のJava APIを検討してください。 Popは、の最初のアイテムをリストから削除します。最初にprintRecurse2()と呼ぶと、最初のアイテムがポップされて印刷されます。次回は、2番目のアイテムがポップされて印刷されます。 removeLast()のような別の方法を調べることができます。

+0

'removeLast'は単独リンクリストでサポートされる操作ではありません。問題は、 'LinkedList'が間違ったデータ構造であることです。 –

+0

@ NiklasB。 Java APIは、単一リンクリストでremoveLastをサポートしています。これが推奨されるかどうかは別の議論です。 –

+1

Java APIは、単一リンクリストIMHOの実装も提供しません。 –

1

ノードに次のノードがあるかどうかを確認する必要があります。

void printReverse(Node node) { 
    if(node.next != null) { // recurse until the last node is found 
     printReverse(node.next); // print the next node first 
    } 
    System.out.println(node.data); // print out the node(this is only reached after the last node is found 
} 

これはあなたのリンクリストの最初のノードに渡すことで、リスト全体を印刷します。この方法は、あなたは、あなたがリストの最後に到達するまで、各要素を印刷延期します。次に、各呼び出しにリスト全体を渡す必要はありません。また、最初の呼び出しに渡すノードを変更することで、リストの一部だけを出力することもできます。このメソッドはLinkedListを消費するので、さらに

public void printRecurse2(LinkedList<String> list) 
{ 
    if(list.isEmpty()) //base 
     return; 
    System.out.println(list.removeLast()); //print the last element 
    printRecurse2(list); //recurse 
} 

:あなたはLinkedList APIからremoveLast()方法を用いて、逆試しの要素を取得する必要がある場合は

+0

ありがとうございました。私はそれを感謝します – user519670

0

、それはその後、LinkedListの最後の要素を削除し返します。 LinkedListのコピーをこのメソッドに渡すことができます。

+0

ありがとう、あなたの助けを大変ありがとう。 – user519670

関連する問題