2011-06-01 6 views
9

線形時間で、後方重リンクリストを印刷します:「一定の空間と線形時間で、後方 を単独リンクリストの印刷」一定のスペースと私は面接の質問を聞いた

私の解決策は、リンクされたリストを所定の位置に戻し、そのように印刷することでした。非破壊的なソリューションがありますか?

答えて

8

あなたは元の順序が復元されているので、それはもはや、破壊できなくなります印刷した後、再びそれを逆にした場合。

+0

それは私が考えていたものです。しかし、実世界の状況でその良い練習ですか?(参照渡しを想定) –

+2

実際には、印刷せずに最初に元に戻し、再度元に戻します。 – x4u

+2

@Razor:ish。通常、印刷のために何かを渡すと、呼び出し先は、それを変更不可能として扱うことになります。そのようなことを気にする言語では、関数は(驚くほど)非constパラメータを取る必要があります。そうでない場合は、関数自体にconst-unsafeコードが含まれている必要があります。そのメリットが間違ったコードを書いてしまうリスクがあるのか​​、それともリストのコピーを逆にする方が良いのか、双方向構造を使うのが良いのかどうかを判断する必要があります。十分な深刻なメリットがあれば、何でも良い練習です;-) –

1

あなたが書きたいものを参照して、リンクされたリストチェーンを再帰呼び出しすることができます。各ノードは、自身を印刷する前に参照を渡しながら、子ノードの印刷機能を使用します。

リスト内の各ノードが通過して最後のノードが書き込みに成功しなくなり、書き込みにまっすぐに進むまで、チェーンをバックアップする各ノードは最後まで最後まで書き込みます。

編集

この実際にあるため、スタック上の線形空間の仕様に適合していません。もしあなたが関数や文字列の前に書き込むメソッドを歩くために何かを持っていれば、基本ロジックはまだ動くことができます。

+1

しかし、それはO(n)スタックスペース=/ –

+1

を使用します。それは線形スペースです - スタックはスペースとして数えます。 –

+1

@Razor - lol、あなたはキーボードでちょっと速いです。 –

6

ちょうど反復して途中で印刷しますが、モニターは上下逆さまになります。

˙uoıʇɐɯɹoɟsuɐɹʇʇxǝʇǝlʇʇılɐɥʇıʍʇɥƃıɹʇsoɯlɐʞooluɐɔʇI

+0

これまでのLOLベストソリューション –

+1

ああ、彼は私にそれを打つ。 –

0

これは通常とは違うアプローチです:コンソールを右から左の読み上げ順序に変更し、通常の順序でリストを印刷します。それらは後方に表示されます。実際のデータを逆の順序で訪問することは、問題の制約のようには思えません。

11

ほとんどの答えを理解しました。リンクされたリストを元の位置に戻し、リストを最初に戻して印刷します。それが恒久的に破壊されないようにするには、リンク先のリストを元に戻して印刷するように、のリンクリストを逆にします。ただし、これは、実行スレッドが1つだけの場合、またはトラバーサル全体がクリティカルセクションになるため、一度に1つのスレッドのみが実行する場合にのみ機能します(つまり、2つ目のスレッドは決して再生できません)。トラバーサルの途中のリスト)。

+1

上の2つの答えは両方とも、この質問に正確に答えます。以前に投稿されたので、もう1つを選択しました。しかし、私は詳細を持っているので、これを投票しました。あまりにも悪いので、私は非常に似ている場合は、複数の答えを受け入れることはできません: –

1

これはインタビューの質問かもしれませんが、実際はweisアルゴリズムの本の背後にある質問です。再帰は一定のスペースを使用しないため、再帰を使用することはできません(インタビュアーが非表示にして明らかにするもの)。解決策は、逆の印刷と逆の逆です。

関連する問題