##题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
##解题思路
1,首先判断一共可以打印几圈
2,每圈的四行打印的边界条件是什么
##代码实现

/**
 * 
 */
package 数组;

import java.util.ArrayList;

/**
 * <p>
 * Title:PrintMatrix
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author 田茂林
 * @data 2017年8月25日 下午2:54:00
 */
public class PrintMatrix {

	/**
	 * 
	 * 循环打印结束条件:当行长度不再大于2倍的左上角列的位置,列的长度不再大于2倍的左上角行的位置
	 * 
	 * @param args
	 */
	public ArrayList<Integer> printMatrix(int[][] matrix) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		if (matrix == null || matrix.length < 1 || matrix[0].length < 1) {
			return list;
		}
		int rows = matrix.length;
		int cols = matrix[0].length;
		int start = 0;
		while (cols > 2 * start && rows > 2 * start) {
			helper(matrix, rows, cols, list, start);
			start++;
		}
		return list;

	}

	public void helper(int[][] matrix, int rows, int cols,
			ArrayList<Integer> list, int start) {
		int endX = cols - start - 1;  // 列号结束的地方
		int endY = rows - start - 1;  // 行标号结束的地方
		// 从左到右打印一行
		for (int i = start; i <= endX; i++) {
			list.add(matrix[start][i]);
		}
		// 从上到下打印一列,只有终止行号大于起始行号才可以
		if (endY > start) {
			for (int i = start + 1; i <= endY; i++) {
				list.add(matrix[i][endX]);
			}
		}
		// 从右到左打印一行,只有终止行号大于起始行号且终止列号大于起始列号才可以
		if (endY > start && endX > start) {
			for (int i = endX - 1; i >= start; i--) {
				list.add(matrix[endY][i]);
			}
		}
		// 从下到上打印一行,终止列号大于起始列号,终止行号大于起始行号+1才行
		if (endY - 1 > start && endX > start) {
			for (int i = endY - 1; i > start; i--) {
				list.add(matrix[i][start]);
			}
		}

	}

	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		int[][] matrix = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
		PrintMatrix p = new PrintMatrix();
		list = p.printMatrix(matrix);
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i));
		}

	}

}

测试结果

123698745