リンクリストにループがある場合(つまり、最後のノードが中間のノードにリンクされている場合)、リンクリストをどのように逆転できますか?ループを持つリンクリストを反転する
まあ、私は、solutions in hereとhereのうちの1つが、リンクされたリストのループを検出することがそれを逆転することを見ました。 私の疑問は、リンク先リストの終わりがわからない場合、リンクされたリストを元に戻すことができる方法です。ループを持つリンクリストをどうやって逆転させることができますか?
リンクリストにループがある場合(つまり、最後のノードが中間のノードにリンクされている場合)、リンクリストをどのように逆転できますか?ループを持つリンクリストを反転する
まあ、私は、solutions in hereとhereのうちの1つが、リンクされたリストのループを検出することがそれを逆転することを見ました。 私の疑問は、リンク先リストの終わりがわからない場合、リンクされたリストを元に戻すことができる方法です。ループを持つリンクリストをどうやって逆転させることができますか?
まずは、この文脈では「逆転」とは何かを定義する必要があります。おそらく、何をする必要が
は、(1)それは巡回
(2)そのリンクを壊す可能リンクを見つけることである
(3)その後、何とかリストを逆転します。
効率的に行うことは、サイクルを識別する効率的な方法を見つけることを意味します。しかし、ノードが既に存在するかどうかを知るための操作をスタックに仮定すると、すでに見たノードへのリンクを与えるまで、ノードをスタックにプッシュするだけで済みます。その後、スタックをポップし、voilaあなたは逆の順序でリストを持っています。
は擬似コードでは、あなたはISIN操作
stack:
init()
push(node)
pop() returns node
isIn(node) returns Boolean
でスタックを必要と
do
get next node
if node isIn stack
then
while stack not empty
pop node
break
else
push node in stack
fi
od
+1は「何を定義する必要があるか」「逆」は「」を意味します。 –
説明を求めてくれてありがとう。それは確かに私が知りたいと思う混乱して正確に - どのようにループされたリンクされたリストが尊敬されることができます..私の編集を確認してください –
問題は、誰も*明確な定義を得るまで/ –
のようなものは、私はあなたがそれを持つリンクリストを逆にする意味を定義する必要が第一だと思いますループ。あなたは、リンクされたリストを持っていると仮定しましょう:
1->2->3->4->5-|
^ |
|-------|
ので、通常のリストを印刷するかどう:12345345345をあなたはサイクルのは、逆に、リンクされたリストは、すべての矢印はその方向を逆転させてきたし、逆にそれが必要意味するだろうと言ってみましょうトラバース続ければ
54354312は、今、あなたはこのような何かを行うことができます印刷:
prev=head;
curr=head->next;
while !curr->visited && curr->next!=end
tmp=prev
prev=curr
curr=curr->next
prev->next=tmp
curr->visited=True
これは擬似コードで、ロジックで彼らのかもしれ小さな誤差はそれほどそのままコピーしませんが、それは1つの基本的な考え方です。
反転リストの印刷方法54354312?ノード3の後、5が来るか1が来る。両方をどうやって手に入れられますか? –
ええ、私は534534 – Sid
これはインタビューの質問や宿題でのみ発生するため、この場合は宿題タグでタグ付けすることを検討してください。実際のアプリの場合は、逆の操作が一般的な操作ですか?その場合は、反転をO(1)操作にするために、エッジの方向に関するフラグを設定することを検討してください。 –
このようなリストを逆にすることは理にかなっていますか?それについて考える。ループがある場合は、2つの入力矢印を持つノードが少なくとも1つあります。反転したものは2つの出力矢印が必要ですか?逆のリストはどこから始まりますか?元のものには終わりがないので、逆のものにはスタートがないでしょうか?いくつかの数学的な意味があり、操作はHaskellなどで簡単に表現することができますが、結果を得ることについての希望は得られません。 –