横行、単独でリンクリストのC++
-
19-09-2019 - |
質問
破壊も修復もおもしろくないのでトラバースリンクされたリストのようになります:
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
equalsfirstNode
?どんなプロジェクトとは?何 すべ すが。。。 - どのようなとき
randomNode
最後のノードのリスト? - どのようなとき
randomNode
はNULL
? - どのようなとき
randomNode
リストにない?
現在、これらすべての場合にも適用できる、場合によって知識がない randomNode
, あれが生じているものと考えられる。しながら、すべての価値を考える.
一度中をご覧頂ければそれもあり、シンプルでエレガントな解決方法を取り扱うかわいらしさがひとしおである。
のコードを見るものを提供している軽微な変化をもたらす while
条件
while(prevNode != currentNode && prevNode != NULL)
のための二つの理由
- コードは、現在の記載が停止の場合はノードまたは"によって指定されたいずれか
prevNode
またはprevNode->link
(そのためにおいてアイデアの特定のポイントcurrentNode
-もしを知りたいと思いまいと暮らしを提案しているウェif
ることにしました。の変更、対象のノードに確保存されprevNode
場合は全てを参照してください次のポイント) - 安全のためにできることを確認
prevNode
ではないNULL
.しかし、パヴェルの記載は、この試験は不要な場合currentNode
保証するものではあの一覧です。
編集に対応しコメント
されている必要がないかどうかを知る currentNode
は prevNode
または 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
するかどうかわからない行われます。 (あなたは簡単にそれをテストすることができるので)これは大きな問題ではありませんが、それは検索の前に、この特殊なケースの状態をテストするのが最善だと私には思えるので、それは特別なケースだということは明らかです。