news 2026/4/23 16:22:13

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/4/23 13:58:48

规模化IoT节点维护成本与能量采集方案设计要点

在PoC原型阶段&#xff0c;节点BOM成本计算通常集中在MCU、传感器与低价电池等部件&#xff0c;整体成本较低。然而&#xff0c;当节点数量从1,000扩展到100,000级别&#xff0c;并部署于数平方公里的化工厂或复杂智慧楼宇中时&#xff0c;维护周期成为影响总成本的核心变量。 …

作者头像 李华
网站建设 2026/4/23 10:49:07

孤能子视角:从“奇点“到意识文明

(从"哲学"研究意识是一件头疼的事。这里让千问先梳理&#xff0c;信兄稍为解释。)主要问题:1.从奇点到有高等动植物的里程碑过程。2.生命演化过程中&#xff0c;关键基因突变推动进化。3.当前的意识学研究程度和结论。1.从奇点到有高等动植物的里程碑过程。千问:这是…

作者头像 李华
网站建设 2026/4/23 12:14:08

普源DS6000系列分段存储深度优化方案

普源DS6000系列示波器以其高精度和强大的功能, 为电子工程师提供了出色的信号捕获与分析能力。其分段存储&#xff08;Segmented Memory&#xff09;功能设计使用户能够在处理复杂信号时高效地管理存储资源&#xff0c;从而提高测试的灵活性与准确性。然而&#xff0c;在实际应…

作者头像 李华
网站建设 2026/4/23 12:20:40

运维远控工具盘点排名第一:为何大公司都选择选择ToDesk

在数字化转型的浪潮中&#xff0c;运维工作作为保障企业业务连续性的基石&#xff0c;正经历着前所未有的深刻变革。传统运维模式下&#xff0c;工程师们往往疲于奔命&#xff0c;效率瓶颈与安全隐忧如影随形。如今&#xff0c;以ToDesk为代表的下一代远程控制技术&#xff0c;…

作者头像 李华
网站建设 2026/4/23 13:35:27

Java毕设项目:基于SpringBoot的少儿编程在线教育网站设计与开发基于Java的scratch少儿编程学习网站系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华