リンクリスト内にループが存在する可能性があります。リンクされたリスト内でループが発生する場所を特定する方法があります。リンクリスト内でループが発生する場所を特定する方法
答えて
ループがある場合は、もはやリンクされたリストではありません。有向グラフです。ループはサイクルと呼ばれます。
グラフでサイクルを見つける1つの方法は、リストを反復して各項目に印を付けることです。既にマークされているアイテムが見つかった場合は、サイクルが見つかりました。
リンクされたリストにループがあるかどうかは、ノードへの参照(たとえば、リストの先頭にあるもの)を保存し、リストを反復処理することで確認できます。ある時点でリストの終わり(ヌル値)に達すると、ループはありません。しかし、以前に保存されていた同じノードを再び見つけた場合、そのリストは循環的であることがわかります。いずれにしても、反復を停止します。
Node
秒のリンクリストが円形である場合たとえば、Javaでこのメソッドはあなたを教えてくれます:で、任意のループを見つけるため
一般的な解決のために:
public boolean isCircular(Node list) {
Node current = list;
while (current != null) {
if (current.next == list)
return true;
current = current.next;
}
return false;
}
EDITリンクされたリストは、Floyd's cycle-finding algorithm(別名「カメとハレ」アルゴリズム)について読んでください。これまでのpostには、Javaの優れた実装があります。
これは任意のポイント間で形成されたループを検出しません(たとえば、ノード6がノード4にループバックします)。リスト内のすべてのノードに対してこの同じメソッドを呼び出す必要があります。これは、安全に繰り返すことができないと考えると難しいです。 – Numeron
@Numeronあなたは正しいです。そのためには、訪問されたすべてのノードを別々のデータ構造(たとえば、セット)に格納し、トラバースされた各ノードについて、すでに訪問したかどうかを確認する必要があります。 –
コードを投稿できますか?もっと慎重に説明しますか? – andersoj