2

我在检查我的邻接列表是否有循环时遇到了一些问题。我想创建一个函数来检查我的邻接列表是否存在至少一个循环

基于我的程序。首先,我必须输入Root Node,然后是节点的数量,图中的节点,边的数量,以及表示边的邻接列表。邻接表中的每个条目都包含一对节点。

样本输入:

Root node: "A"
Number of nodes: 3
Vertices/Nodes:
A
B
C
Number of edges: 3
A
B
B
C
C
A

A --> B
B --> C
C --> A

上面的示例输入有一个循环: [ A --> B --> C --> A ]我想输出它是否有一个循环。

到目前为止,这是我的程序:

import java.util.Scanner;

class Neighbor {
public int vertexNum;
public Neighbor next;
public Neighbor(int vnum, Neighbor nbr) {
        this.vertexNum = vnum;
        next = nbr;
    }
}

class Vertex {
String name;
Neighbor adjList;
Vertex(String name, Neighbor neighbors) {
        this.name = name;
        this.adjList = neighbors;
    }
}

public class DirectedCycle {

Vertex[] adjLists;

public DirectedCycle() {

    Scanner sc = new Scanner(System.in);
    //Root Node
    System.out.print("Root node: ");
    String rn = sc.nextLine();

    //Number of nodes
    System.out.print("Number of vertices/nodes: ");
    int nodes = sc.nextInt();
    adjLists = new Vertex[nodes];

    //List of nodes
    System.out.println("Vertices:");
    for (int v=0; v < adjLists.length; v++) {
        String letter = sc.next();
        adjLists[v] = new Vertex(letter, null);
    }
    //Number of edges
    System.out.print("Number of edges: ");
    int edges = sc.nextInt();
    System.out.println("<v1> <v2>");
    for(int i=0; i<edges; i++) {

        int v1 = indexForName(sc.next());
        int v2 = indexForName(sc.next());

        adjLists[v1].adjList = new Neighbor(v2, adjLists[v1].adjList);
    }
}

int indexForName(String name) {
    for (int v=0; v < adjLists.length; v++) {
        if (adjLists[v].name.equals(name)) {
            return v;
        }
    }
    return -1;
}   

public void print() {

    System.out.println();
    for (int v=0; v < adjLists.length; v++) {
        System.out.print(adjLists[v].name);
        for (Neighbor nbr=adjLists[v].adjList; nbr != null; nbr=nbr.next) {
            String name = adjLists[nbr.vertexNum].name;
            System.out.print(" --> " + name);
        }
        System.out.println("\n");
    }
}

public static void main(String[] args)  {
    DirectedCycle graph = new DirectedCycle();
    graph.print();
    }
}

我上面的程序还没有检查周期的功能,而且我想实现根节点的东西.. 如果有人可以改进我上面的程序,请回答我并给我一些我可以依赖的代码。谢谢!(我是初学者!)

4

2 回答 2

3

弗洛伊德循环检测算法中检测循环的最有效方法。,这基本上是在链表上移动两个指针,一个以正常方式一次移动慢速指针,另一个以慢速指针的两倍速度移动,即快速指针。

Java 代码相同。

boolean detectloop(Node list) {
    if(list == null) 
        return false;
    Node slow, fast; 
    slow = fast = list; 
    while(true) {
        slow = slow.next;          
        if(fast.next != null)
            fast = fast.next.next; 
        else
            return false;
        if(slow == null || fast == null) 
            return false;
        if(slow == fast)
            return true;
    }
}

于 2015-01-06T05:10:51.087 回答
1

要检查链表的循环,您需要使用两个不同的指针进行迭代,其中一个指针在链表中的移动速度是其两倍。如果有循环,最终会用这种方法检测出来。另外,对于结束条件,可以查看是否所有节点都被访问过,如果是,则没有循环。

于 2015-01-06T04:48:56.747 回答