gpt4 book ai didi

java - 邻接链表循环检测 - Java

转载 作者:行者123 更新时间:2023-11-30 08:18:05 26 4
gpt4 key购买 nike

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

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

示例输入:

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

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

最佳答案

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

关于java - 邻接链表循环检测 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27792231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com