1,比邻接表难一点点, 毕竟多一个指针域。
2,为控制代码量, 只做了建表和 toString。
package java31to40;
public class D37_OrthogonalList {
class OrthogonalNode {
int row;
int column;
OrthogonalNode nextOut;
OrthogonalNode nextIn;
public OrthogonalNode(int paraRow, int paraColumn) {
row = paraRow;
column = paraColumn;
nextOut = null;
nextIn = null;
}
}
int numNodes;
OrthogonalNode[] headers;
public static void main(String[] args) {
int[][] tempMatrix = { { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 1, 0, 0, 0 }, { 0, 1, 1, 0 } };
D37_OrthogonalList tempList = new D37_OrthogonalList(tempMatrix);
System.out.println("数据是:\r\n" + tempList);
}
public D37_OrthogonalList(int[][] paraMatrix) {
numNodes = paraMatrix.length;
OrthogonalNode tempPreviousNode, tempNode;
headers = new OrthogonalNode[numNodes];
for (int i = 0; i < numNodes; i++) {
headers[i] = new OrthogonalNode(i, -1);
tempPreviousNode = headers[i];
for (int j = 0; j < numNodes; j++) {
if (paraMatrix[i][j] == 0) {
continue;
}
tempNode = new OrthogonalNode(i, j);
tempPreviousNode.nextOut = tempNode;
tempPreviousNode = tempNode;
}
}
OrthogonalNode[] tempColumnNodes = new OrthogonalNode[numNodes];
for (int i = 0; i < numNodes; i++) {
tempColumnNodes[i] = headers[i];
}
for (int i = 0; i < numNodes; i++) {
tempNode = headers[i].nextOut;
while (tempNode != null) {
tempColumnNodes[tempNode.column].nextIn = tempNode;
tempColumnNodes[tempNode.column] = tempNode;
tempNode = tempNode.nextOut;
}
}
}
public String toString() {
String resultString = "Out arcs: ";
OrthogonalNode tempNode;
for (int i = 0; i < numNodes; i++) {
tempNode = headers[i].nextOut;
while (tempNode != null) {
resultString += " (" + tempNode.row + ", " + tempNode.column + ")";
tempNode = tempNode.nextOut;
}
resultString += "\r\n";
}
resultString += "\r\nIn arcs: ";
for (int i = 0; i < numNodes; i++) {
tempNode = headers[i].nextIn;
while (tempNode != null) {
resultString += " (" + tempNode.row + ", " + tempNode.column + ")";
tempNode = tempNode.nextIn;
}
resultString += "\r\n";
}
return resultString;
}
}
结果输出:
数据是:
Out arcs: (0, 1)
(1, 3)
(2, 0)
(3, 1) (3, 2)
In arcs: (2, 0)
(0, 1) (3, 1)
(3, 2)
(1, 3)