2012-03-02 12 views
0

リンクリストにループがある場合(つまり、最後のノードが中間のノードにリンクされている場合)、リンクリストをどのように逆転できますか?ループを持つリンクリストを反転する

まあ、私は、solutions in herehereのうちの1つが、リンクされたリストのループを検出することがそれを逆転することを見ました。 私の疑問は、リンク先リストの終わりがわからない場合、リンクされたリストを元に戻すことができる方法です。ループを持つリンクリストをどうやって逆転させることができますか?

+4

これはインタビューの質問や宿題でのみ発生するため、この場合は宿題タグでタグ付けすることを検討してください。実際のアプリの場合は、逆の操作が一般的な操作ですか?その場合は、反転をO(1)操作にするために、エッジの方向に関するフラグを設定することを検討してください。 –

+1

このようなリストを逆にすることは理にかなっていますか?それについて考える。ループがある場合は、2つの入力矢印を持つノードが少なくとも1つあります。反転したものは2つの出力矢印が必要ですか?逆のリストはどこから始まりますか?元のものには終わりがないので、逆のものにはスタートがないでしょうか?いくつかの数学的な意味があり、操作はHaskellなどで簡単に表現することができますが、結果を得ることについての希望は得られません。 –

答えて

4

まずは、この文脈では「逆転」とは何かを定義する必要があります。おそらく、何をする必要が

は、(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 
+0

+1は「何を定義する必要があるか」「逆」は「」を意味します。 –

+0

説明を求めてくれてありがとう。それは確かに私が知りたいと思う混乱して正確に - どのようにループされたリンクされたリストが尊敬されることができます..私の編集を確認してください –

+0

問題は、誰も*明確な定義を得るまで/ –

0

のようなものは、私はあなたがそれを持つリンクリストを逆にする意味を定義する必要が第一だと思いますループ。あなたは、リンクされたリストを持っていると仮定しましょう:

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つの基本的な考え方です。

+1

反転リストの印刷方法54354312?ノード3の後、5が来るか1が来る。両方をどうやって手に入れられますか? –

+0

ええ、私は534534 – Sid

関連する問題