news 2026/9/3 6:33:52

java.有向图邻接表深度优先遍历手写心得

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java.有向图邻接表深度优先遍历手写心得

基本思路就是:构造一个列表这个列表的每个元素是一个列表,

private List<List<Integer>> arrList;

然后就是为arrList添加列表,和顶点数相同,一定要注意的是不能光写一个for循环,

for (int i=1;i<=total;i++){ arrList.add(new ArrayList<>()); }

要这样写!如下图,在这个构造方法中for循环之前一定要多一步arrList.add(new ArrayList<>());

因为你循环为每个节点加列表的时候,arrList.add默认会从尾部加,也就是说我想跳过arrList[0],只加到索引1~5,是不可能的,系统会默认从索引0开始加所以,只用for循环加列表,实际上是从arrList的索引为0开始加,加到索引为4,最后一个索引5不会拥有一个列表,因此程序会报错。

public youGraphDfs2(int total){ this.total=total; this.arrList=new ArrayList<>(total+1); //total +1 arrList.add(new ArrayList<>()); for (int i=1;i<=total;i++){ arrList.add(new ArrayList<>()); } }

接着就是添加边,邻接表法构造有向图,就是arrList中的每个元素代表一个顶点,顶点又是一个列表,每个顶点的列表存储顶点的邻居顶点,又因为是有向图不需要双向添加,只需要添加一次即可,然后再进行深度优先遍历。

public void addEdge(int i,int j){ arrList.get(i).add(j); //添加用list操作方法,get和add }

深度优先遍历,有两个方法,两个方法的本质是一样的都是递归遍历,其二是封装调用函数。其一:

public void dfs(int start,boolean[] visit){ visit[start]=true; System.out.print("V"+start+" "); //邻接表深度优先是队列形式 for(int neighbor:arrList.get(start)){ if(!visit[neighbor]){ dfs(neighbor,visit); } }

其二:

public void dfs(int start){ boolean[] visit=new boolean[total+1]; dfsUtil(start,visit); } public void dfsUtil(int i,boolean[] visit){ visit[i]=true; System.out.print("V"+i+" "); //!!遍历它所有的邻居节点,就是不断的先遍历第一个列表找到每一个的邻居 for(int neighbor:arrList.get(i)){ if(!visit[neighbor]){ dfsUtil(neighbor,visit); } }

完整代码展示:

package 算法; import java.util.ArrayList; import java.util.List; public class youGraphDfs2 { //链表法写 private int total; private List<List<Integer>> arrList; public youGraphDfs2(int total){ this.total=total; this.arrList=new ArrayList<>(total+1); //total +1 arrList.add(new ArrayList<>()); for (int i=1;i<=total;i++){ arrList.add(new ArrayList<>()); } } public void addEdge(int i,int j){ arrList.get(i).add(j); //添加用list操作方法,get和add } public void dfs(int start,boolean[] visit){ visit[start]=true; System.out.print("V"+start+" "); //邻接表深度优先是队列形式 for(int neighbor:arrList.get(start)){ if(!visit[neighbor]){ dfs(neighbor,visit); } } // public void dfs(int start){ // boolean[] visit=new boolean[total+1]; // dfsUtil(start,visit); // } // public void dfsUtil(int i,boolean[] visit){ // visit[i]=true; // System.out.print("V"+i+" "); // //!!遍历它所有的邻居节点,就是不断的先遍历第一个列表找到每一个的邻居 //// for(int j=1;j<=total;j++){ //// if(arrList.get(i).get()) //// } // //for // for(int neighbor:arrList.get(i)){ // if(!visit[neighbor]){ // dfsUtil(neighbor,visit); // } // } // } public static void main(String[] args) { youGraphDfs2 y=new youGraphDfs2(5); y.addEdge(1, 2); y.addEdge(1, 4); y.addEdge(4, 3); y.addEdge(3, 2); y.addEdge(3, 5); y.addEdge(2, 5); boolean[] visit=new boolean[y.total+1]; y.dfs(1,visit); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 11:40:52

WebSocket 实时聊天功能

在上一讲中&#xff0c;Spring Boot 后端实现 WebSocket 已创建过后端项目&#xff0c;现在开始补充前端 在项目下新增一个模块frontend【与后端src目录平级】 在前端目录下执行npm install 不看上一讲也可以&#xff0c;直接创建一个前后端项目即可&#xff0c;下面会给出完整…

作者头像 李华
网站建设 2026/9/2 23:17:45

蓝桥杯103 日期问题

题目链接&#xff1a;https://www.lanqiao.cn/problems/103/learning/ 前置知识 输入解析 要会什么&#xff1f; 会用这一句把 AA/BB/CC 读进来&#xff1a; int a,b,c; scanf("%d/%d/%d", &a, &b, &c); 要记住什么&#xff1f; "%d/%d/%d"…

作者头像 李华
网站建设 2026/9/2 4:12:03

leetcode解题方法

双指针法&#xff1a;适用于有序数组去重、两数之和等问题。通过左右指针减少时间复杂度至O(n)。示例代码&#xff1a;c复制插入int removeDuplicates(int* nums, int numsSize) {if (numsSize 0) return 0;int slow 0;for (int fast 1; fast < numsSize; fast) {if (num…

作者头像 李华
网站建设 2026/9/2 10:20:05

八)--工具和MCP调用

1. 工程结构概览Spring AI 提供了完整的工具调用&#xff08;Tool Calling&#xff09;能力&#xff0c;让 AI 模型可以调用外部服务。同时&#xff0c;Spring AI 还支持 MCP&#xff08;Model Context Protocol&#xff09;&#xff0c;这是一个标准化的工具协议。spring-ai-m…

作者头像 李华
网站建设 2026/9/2 13:24:57

国产GPU适配实战——五款二线主流AI加速卡深度评测

文章目录前言一、海光 DCU K100_AI —— 适配体验最佳硬件规格生态资源租用渠道适配体验ONNX适配综合评价二、寒武纪 MLU370-M8 —— 需要技术支持硬件规格生态资源获取方式适配方式遇到的问题ONNX支持重要提醒三、沐曦 C500 —— 资源丰富的后起之秀硬件规格生态资源租用渠道适…

作者头像 李华