上一篇博文讲到用相邻矩阵法表示图形,该方法的优点是直观,访问方便,缺点是,当图形的规模庞大,节点数目很多时,有许多节点之间并无连接,这样就浪费了大量的存储空间。而相邻表法则解决了这一问题。
相邻表法只记录图形中存在的连接,也即只记录相邻矩阵中1的部分。
使用相邻表法表示的话,每个节点使用一张表,每张表包括一个表头和与该节点相连的其他节点,表头用来表征该表与哪个节点相对应。如上述无向图和有向图,用相邻表法分别表示如下:
生成相邻表的源代码如下:
package javaTest;
public class GraphList {//列表类,每一个列表有n个链接类构成,n为节点的个数
public static void main(String args[]){
int[][] data1 = {
{1,2},{2,1},{1,4},{4,1},
{1,5},{5,1},{2,3},{3,2},
{2,4},{4,2},{3,4},{4,3},
{3,5},{5,3}
};
int[][] data2 = {
{1,2},{1,5},{2,4},{3,2},
{3,4},{4,1},{5,3}
};
System.out.println("The undirected graph expressed with link list:");
new GraphList(data1);
System.out.println();
System.out.println("The directed graph expressed with link list:");
new GraphList(data2);
}
public GraphList(int[][] data){
int maxNodeValue = 0;
for(int i=0; i<data.length; i++){//判断初始数据中提供的节点的个数
for(int j=0; j<data[i].length; j++){
if(maxNodeValue<data[i][j]){
maxNodeValue = data[i][j];
}
}
}
GraphLink[] linkHead = new GraphLink[maxNodeValue+1];
for(int i=1; i<linkHead.length; i++){
linkHead[i] = new GraphLink();
for(int j=0; j<data.length; j++){
if(data[j][0]==i){
linkHead[i].insert(data[j][1]);
}
}
System.out.print("Node"+i+"->");
linkHead[i].print();
System.out.println();
}
}
}
class Node{//节点类
int value;
Node nextNode;
public Node(int value){
this.value = value;
nextNode = null;
}
}
class GraphLink{//链接类
Node head;
Node tail;
public boolean isEmpty(){
return head==null;
}
public void print(){//打印链接
Node tempNode = head;
while(tempNode != null){
System.out.print("["+tempNode.value+"] ");
tempNode = tempNode.nextNode;
}
}
public void insert(int value){//往链接中插入节点
Node tempNode = new Node(value);
if(this.isEmpty()){
head = tempNode;
tail = tempNode;
}
else{
tail.nextNode = tempNode;
tail = tempNode;
}
}
}
程序输出:
The undirected graph expressed with link list:
Node1->[2] [4] [5]
Node2->[1] [3] [4]
Node3->[2] [4] [5]
Node4->[1] [2] [3]
Node5->[1] [3]
The directed graph expressed with link list:
Node1->[2] [5]
Node2->[4]
Node3->[2] [4]
Node4->[1]
Node5->[3]