Java学习第37天,十字链表

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java实现稀疏矩阵十字链表储存的示例代码: ```java //定义节点类 class OLNode { int row, col; int val; OLNode right, down; } //定义十字链表类 class CrossList { int rows, cols, nums; OLNode[] rowHeads, colHeads; //构造函数 public CrossList(int[][] matrix) { rows = matrix.length; cols = matrix[0].length; rowHeads = new OLNode[rows]; colHeads = new OLNode[cols]; //初始化行列头节点 for (int i = 0; i < rows; i++) { rowHeads[i] = new OLNode(); rowHeads[i].row = i; rowHeads[i].right = rowHeads[i]; } for (int j = 0; j < cols; j++) { colHeads[j] = new OLNode(); colHeads[j].col = j; colHeads[j].down = colHeads[j]; } //遍历矩阵,创建节点并插入十字链表 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (matrix[i][j] != 0) { OLNode node = new OLNode(); node.row = i; node.col = j; node.val = matrix[i][j]; //插入行链表 OLNode p = rowHeads[i]; while (p.right != rowHeads[i] && p.right.col < j) { p = p.right; } node.right = p.right; p.right = node; //插入列链表 p = colHeads[j]; while (p.down != colHeads[j] && p.down.row < i) { p = p.down; } node.down = p.down; p.down = node; nums++; } } } } //打印十字链表 public void print() { for (int i = 0; i < rows; i++) { OLNode p = rowHeads[i].right; for (int j = 0; j < cols; j++) { if (p != rowHeads[i] && p.col == j) { System.out.print(p.val + " "); p = p.right; } else { System.out.print("0 "); } } System.out.println(); } } } //测试代码 public class Main { public static void main(String[] args) { int[][] matrix = {{1, 0, 0, 0}, {0, 2, 0, 0}, {0, 0, 3, 0}, {0, 0, 0, 4}}; CrossList crossList = new CrossList(matrix); crossList.print(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值