无向图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; } }
错误截图:
希望了解相关概念的开发者能帮忙解答该问题。
可能的错误原因及修复方案
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
相关产品推荐
相关产品推荐

