2012-05-10 5 views

答えて

5

ループがある場合は、もはやリンクされたリストではありません。有向グラフです。ループはサイクルと呼ばれます。

グラフでサイクルを見つける1つの方法は、リストを反復して各項目に印を付けることです。既にマークされているアイテムが見つかった場合は、サイクルが見つかりました。

2

リンクされたリストにループがあるかどうかは、ノードへの参照(たとえば、リストの先頭にあるもの)を保存し、リストを反復処理することで確認できます。ある時点でリストの終わり(ヌル値)に達すると、ループはありません。しかし、以前に保存されていた同じノードを再び見つけた場合、そのリストは循環的であることがわかります。いずれにしても、反復を停止します。

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の優れた実装があります。

+0

これは任意のポイント間で形成されたループを検出しません(たとえば、ノード6がノード4にループバックします)。リスト内のすべてのノードに対してこの同じメソッドを呼び出す必要があります。これは、安全に繰り返すことができないと考えると難しいです。 – Numeron

+0

@Numeronあなたは正しいです。そのためには、訪問されたすべてのノードを別々のデータ構造(たとえば、セット)に格納し、トラバースされた各ノードについて、すでに訪問したかどうかを確認する必要があります。 –