java:邻接表无向图的链表实现法

首先画出邻接表图:



分析:

    观察右边的邻接表可以发现,A~E每个顶点都有自己的编号,每个顶点又跟其他数组相关联。我们可以把所有的顶点看做一个数组,而与每个顶点相关联的其他顶点又是一个数组,那么整个邻接表就是一个二维数组。也可以看作是一个   List<ArrayList<T>>对象。

代码实现:

package my.graph;

import java.util.ArrayList;
import java.util.List;

/**
 * 用链表数组实现邻接表无向图
 * 
 * @author 大叔
 *
 * @date 2018年6月13日 下午10:36:39
 *
 */
public class GraphByList {
	
	// 节点链表list,该list的每一项又是一个ArrayList,即每个节点相当于一个二维数组
	private List<ArrayList<Node>> nodeList;
	// 顶点最多个数
	private int maxCount;

	// 初始化链表
	public GraphByList(int count) {
		this.maxCount = count;

		// 初始化大小为maxCount的链表list
		nodeList = new ArrayList<ArrayList<Node>>(maxCount);

		// 初始化每个链表
		for (int i = 0; i < maxCount; i++) {
			// 初始化每个节点
			nodeList.add(new ArrayList<Node>());
		}
	}

	// 为顶点编号分别为i和j的两个顶点添加边
	public void addEdges(int i, int j) {
		// 给编号为i的顶点一条添加指向编号为j的边
		nodeList.get(i).add(new Node(j));
	}

	// 输出链表图
	public void printNodeList() {
		// 遍历每个顶点
		for (int i = 0; i < nodeList.size(); i++) {
			// 输出当前顶点编号
			System.out.print("顶点:" + i);

			// 获取当前节点下的所有节点
			ArrayList<Node> nodes = nodeList.get(i);
			// 遍历当前节点下所有的节点
			for (int j = 0; j < nodes.size(); j++) {
				System.out.print(" --> " + nodes.get(j).num);
			}

			// 该链表list遍历完成后回车继续下一个链表
			System.out.println(";");
		}
	}

	/**
	 * 链表节点
	 *
	 * @author 大叔
	 *
	 * @date 2018年6月13日 下午10:39:30
	 *
	 */
	class Node {

		// 顶点编号
		int num;

		public Node(int num) {
			this.num = num;
		}

	}
}

测试代码:

package my.junit;

import org.junit.Test;

import my.graph.GraphByList;

/**
 * GraphByList的测试类
 *
 * @author 大叔
 *
 * @date 2018年6月14日  上午12:20:08
 *
 */
public class TestGraphByList {

	/**
	 * 测试定点数为5的邻接点无向图
	 */
	@Test
	public void test1() {
		// 初始化一个顶点数为5的链表集合
		GraphByList graphByList_5 = new GraphByList(5);
		
		// 给链表添加边
		// A --> B
		graphByList_5.addEdges(0, 1);
		// A --> D
		graphByList_5.addEdges(0, 3);
		// A --> E
		graphByList_5.addEdges(0, 4);
		// B --> 1
		graphByList_5.addEdges(1, 0);
		// B --> C
		graphByList_5.addEdges(1, 2);
		// B --> E
		graphByList_5.addEdges(1, 3);
		// C --> B
		graphByList_5.addEdges(2, 1);
		// C --> E
		graphByList_5.addEdges(2, 4);
		// D --> A
		graphByList_5.addEdges(3, 0);
		// D --> C
		graphByList_5.addEdges(3, 2);
		// E --> A
		graphByList_5.addEdges(4, 0);
		// E --> B
		graphByList_5.addEdges(4, 1);
		
		// 输出链表图
		graphByList_5.printNodeList();
		
	}
		
}

测试结果:


总结:

    第一次用代码实现算法,写的确实特别烂,测试的时候就发现还有很多可以优化的地方。但是今天已经太晚了就先到这里改天再进行优化并慢慢增加难度。COME ON!


阅读更多
个人分类: 算法
所属专栏: Java
上一篇JS创建数组及数组的常用方法
下一篇spring mvc controller间跳转 重定向 传参
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭