You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历邻接链表所有成员并计算各节点的度数

解决邻接链表遍历与节点度数计算问题

看起来你已经把邻接链表的核心构建逻辑搞定了,接下来咱们一步步解决剩下的两个问题:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:21:19