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

无向图BFS算法索引错误:段错误问题求助

无向图BFS实现出现段错误问题排查

我在实现无向图的BFS(广度优先搜索)算法时,出现了段错误(segmentation fault)。以下是我的Java代码实现:

class Solution {
 // Function to return Breadth First Traversal of given graph.
 public ArrayList<Integer> bfsOfGraph(int V, ArrayList<ArrayList<Integer>> adj)     
 {
    ArrayList<Integer> result = new ArrayList<>();
    
    Queue<Integer> q = new LinkedList<>();
    q.add(0);
    
    boolean[] visited = new boolean[V];
    visited[0] = true;
    
    while(!q.isEmpty()) {
        int v = q.poll();
        result.add(v);
        
        ArrayList<Integer> adjList = adj.get(v);
        for(int i : adjList) {
            if(!visited[i]) {
                visited[i] = true;
                q.add(i);    
            }
        }
    }
    
    return result;
 }      
}

错误截图:
ERROR Image

希望了解相关概念的开发者能帮忙解答该问题。


可能的错误原因及修复方案

1. 边界情况未处理

  • 当输入的V <= 0时,创建boolean[] visited = new boolean[V];会生成长度为0的数组,后续访问visited[0]会触发数组越界异常,在部分环境下可能表现为段错误。
  • 若adj为空,或者adj的大小小于V(节点编号范围是0到V-1,adj需要包含至少V个元素),调用adj.get(v)会抛出IndexOutOfBoundsException。

2. 邻接节点编号越界

如果adj中某个节点的邻接列表包含了大于等于V或小于0的节点编号,访问visited[i]时会触发数组越界,导致错误。

3. 邻接列表为空指针

若adj中某个位置的元素为null,遍历adjList时会抛出NullPointerException。

修复后的代码示例

class Solution {
    // Function to return Breadth First Traversal of given graph.
    public ArrayList<Integer> bfsOfGraph(int V, ArrayList<ArrayList<Integer>> adj) {
        ArrayList<Integer> result = new ArrayList<>();
        // 处理边界情况
        if (V <= 0 || adj == null || adj.size() < V) {
            return result;
        }
        
        Queue<Integer> q = new LinkedList<>();
        boolean[] visited = new boolean[V];
        
        q.add(0);
        visited[0] = true;
        
        while (!q.isEmpty()) {
            int v = q.poll();
            result.add(v);
            
            ArrayList<Integer> adjList = adj.get(v);
            // 跳过空的邻接列表
            if (adjList == null) {
                continue;
            }
            for (int i : adjList) {
                // 检查节点编号合法性,避免数组越界
                if (i >= 0 && i < V && !visited[i]) {
                    visited[i] = true;
                    q.add(i);
                }
            }
        }
        
        return result;
    }
}

内容的提问来源于stack exchange,提问作者Luvraj Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:39:32