質問

破壊も修復もおもしろくないのでトラバースリンクされたリストのようになります:


currentNode = randomNode;//where randomNode may or may not = firstNode
prevNode = firstNode;
while(prevNode != currentNode && prevNode->link != currentNode)
{
    prevNode = prevNode->link;
}

ことはできないことC++たいと考えているときのノードの前にcurrentNodeに重リンクリスト?

して実装するこのようなコンソールアプリのための学校の課題では利用できない"パッケージはboost図書館/一覧/もしも情報が見つからないか、すなど。のではないでしょうかいみなプリミティブデータ型やライブラリです。

役に立ちましたか?

解決

あなたはprevNode->リンクがnull参照の場合には現ノードが実際にリンクされていない、のいずれかではないことを確認したい場合があります。

他のヒント

これはうまく動作するはずです。あなたはまだそれを試してみました?

このコードは、あなたのリストの一部を通過するが、あなたのリストがリンクされている方法に依存する部分でしょう。それは頭部>尾(読み:尾に対するリンクノードへのヘッドノードのリンク)から行くなら、あなたはランダムな位置から最後尾に始まるあなたのリストをトラバースします。リンクはヘッド<-tailているなら、あなたは頭にランダムな位置からトラバースでしょう。どちらの場合では、リスト内のすべてのノードを触れないでしょう。

上記のすべては、次のようないくつかのリンクリストを想定しています:

[head]<->[0...N Nodes]<->[Tail]

リンクは、いずれかの方法かもしれません。

また、あなたは頭と尾のノードをリンクし、循環的にリンクされたリストを作成することができます。そのシナリオでは、あなたが戻ってあなたの元のノードになるまで単に横断することにより、すべてのノードを訪問することが可能である。

だと考えることができ端の場合:

  • 何が起こる randomNode equals firstNode?どんなプロジェクトとは?何 すべ すが。。。
  • どのようなとき randomNode 最後のノードのリスト?
  • どのようなとき randomNodeNULL?
  • どのようなとき randomNode リストにない?

現在、これらすべての場合にも適用できる、場合によって知識がない randomNode, あれが生じているものと考えられる。しながら、すべての価値を考える.

一度中をご覧頂ければそれもあり、シンプルでエレガントな解決方法を取り扱うかわいらしさがひとしおである。

のコードを見るものを提供している軽微な変化をもたらす while 条件

while(prevNode != currentNode && prevNode != NULL)

のための二つの理由

  • コードは、現在の記載が停止の場合はノードまたは"によって指定されたいずれか prevNode または prevNode->link (そのためにおいてアイデアの特定のポイント currentNode -もしを知りたいと思いまいと暮らしを提案しているウェ if ることにしました。の変更、対象のノードに確保存され prevNode 場合は全てを参照してください次のポイント)
  • 安全のためにできることを確認 prevNode ではない NULL.しかし、パヴェルの記載は、この試験は不要な場合 currentNode 保証するものではあの一覧です。

編集に対応しコメント

されている必要がないかどうかを知る currentNodeprevNode または prevNode->link, て使用停止(可能な場合) currentNode == prevNode->link, そのオリジナル while に影響はありません。しかし...

がある場合のみ実行される上位 このコードを防止する prevNode いるか、nullの場合 既に

そのような欠点が違うかをチェック NULL.あり静な状態が心の本来の姿であるときにチェックする前に、その理由として、 NULL チェックのループの場合 currentNodeない リストには、このノードです。その場合このような他のリンクリストの値 link のための最後のノードが NULL.その場合、現在のコードが終わ呼び出し NULL->link のコースでクラッシュプログラム.そこでまだチェック NULL

while(prevNode != NULL && prevNode != currentNode && prevNode->link!=currentNode)

んだよ その currentNode のリストでその guess チェックインも不要ですがいきがちですが、もっとは良い習慣を取得します。

あなたも持つことができます:

while (prevNode && prevNode != currentNode)
    prevNode = prevNode->link;

しかし、あなたが正常に見えるています。

掲載として、私は(現ノードがリストまたは他のエラー処理にない場合は、リストの末尾をオフに実行しているの他の回答で説明可能性は別として)コードを変更したい小さな事があるときながら、そのループはprevNodeまたはprevNode->linkポイントがcurrentNodeするかどうかわからない行われます。 (あなたは簡単にそれをテストすることができるので)これは大きな問題ではありませんが、それは検索の前に、この特殊なケースの状態をテストするのが最善だと私には思えるので、それは特別なケースだということは明らかです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top