如何遍历邻接链表所有成员并计算各节点的度数
解决邻接链表遍历与节点度数计算问题
看起来你已经把邻接链表的核心构建逻辑搞定了,接下来咱们一步步解决剩下的两个问题:
1. 遍历并列出邻接链表所有成员
其实你写的print()方法已经完全实现了这个功能!它会逐个遍历图中的每个顶点,然后顺着每个顶点的邻接链表,把所有关联的节点都打印出来。从你给出的当前输出就能看到,每个节点的邻接成员都被清晰列出来了,比如Sapna的邻接链表就正确显示了Sapna --> Sapna --> Rohit --> Rahul。
如果想要让输出更直观友好,也可以微调一下print()方法的格式:
public void print() { System.out.println("=== 邻接链表遍历结果 ==="); for (int v=0; v < adjLists.length; v++) { System.out.print(adjLists[v].name + " 的邻接节点:"); Neighbor current = adjLists[v].adjList; if (current == null) { System.out.print("无"); } else { while (current != null) { System.out.print(" " + adjLists[current.vertexNum].name); if (current.next != null) { System.out.print(" -->"); } current = current.next; } } System.out.println("\n"); } }
2. 计算每个节点的度数
节点的度数就是它的邻接链表中元素的个数(按照你给出的Sapna例子,自环也计入度数)。咱们可以新增两个方法来实现需求:一个用来获取单个节点的度数,另一个用来批量输出所有节点的度数。
单个节点度数计算方法
// 根据节点名称获取对应度数 int getDegree(String vertexName) { int vertexIndex = indexForName(vertexName); if (vertexIndex == -1) { System.out.println("节点 " + vertexName + " 不存在!"); return 0; } int degreeCount = 0; Neighbor currentNeighbor = adjLists[vertexIndex].adjList; // 遍历邻接链表统计节点数量 while (currentNeighbor != null) { degreeCount++; currentNeighbor = currentNeighbor.next; } return degreeCount; }
批量输出所有节点度数方法
// 输出图中所有节点的度数 public void printAllNodeDegrees() { System.out.println("\n=== 所有节点的度数 ==="); for (Vertex vertex : adjLists) { int degree = getDegree(vertex.name); System.out.println(vertex.name + " 的度数:" + degree); } }
(可选)计算图的总边数
如果你的countEdges()方法是想计算整个图的总边数,需要注意:无向图中,非自环的边会被两个节点各存储一次,而自环只存储一次。对应的计算逻辑如下:
int countEdges() { int totalDegreeSum = 0; int selfLoopCount = 0; for (int v=0; v < adjLists.length; v++) { Neighbor current = adjLists[v].adjList; while (current != null) { totalDegreeSum++; // 统计自环数量:邻接节点是自身时 if (current.vertexNum == v) { selfLoopCount++; } current = current.next; } } // 总边数 = (总度数 - 自环数)/2 + 自环数 (自环只算一条边,但度数贡献了1) return (totalDegreeSum - selfLoopCount) / 2 + selfLoopCount; }
整合到主方法中
最后把这些方法加到main()方法里,就能看到完整的运行结果了:
public static void main(String[] args) throws IOException { Scanner br = new Scanner(System.in); System.out.print("Enter graph input file name: "); String file = br.nextLine(); Graph graph = new Graph(file); // 遍历输出邻接链表 graph.print(); // 输出所有节点度数 graph.printAllNodeDegrees(); // (可选)输出总边数 System.out.println("\n图的总边数:" + graph.countEdges()); br.close(); }
用你的输入文件测试时,会得到符合预期的结果:比如Sapna的度数为3,总边数为10(9条普通边+1条自环)。
内容的提问来源于stack exchange,提问作者Teju_M
相关产品推荐
相关产品推荐

