【问题标题】:Adjacency Linked List Cycle Detection - Java邻接链表循环检测 - Java
【发布时间】:2015-03-03 17:46:26
【问题描述】:

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

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

示例输入:

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();
    }
}

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

【问题讨论】:

标签: java cycle directed-graph adjacency-list cycle-detection


【解决方案1】:

Floyd's Cycle detection algo.中检测循环的最有效方法,基本上是在链表上移动两个指针,一个以正常的一步移动慢指针,另一个以慢指针的两倍速度移动,即快速指针。

相同的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;
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 2012-06-18
      • 2011-12-04
      • 2011-11-15
      • 2012-01-06
      相关资源
      最近更新 更多