该类题目需要从宏观的角度去考虑。
1.首先定义一个方法,给定左上角和右下角两个点,使用四个循环遍历输出矩阵外圈。注:需要考虑只包含一行和一列的情况。
2.确定矩阵的左上角和右下角,不断往里递进,调用步骤1中的方法打印当前矩阵的最外圈。

public static ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        int row1 = 0;
        int col1 = 0;
        int row2 = matrix.length - 1;
        int col2 = matrix[0].length - 1;
        while (row1 <= row2 && col1 <= col2) {
            printLevel(list, matrix, row1++, col1++, row2--, col2--);
        }
        return list;
    }

    public static void printLevel(ArrayList<Integer> list, int[][] matrix,
                                  int row1, int col1, int row2, int col2) {
        if (row1 == row2) {
            for (int i = col1; i <= col2; i++) {
                list.add(matrix[row1][i]);
            }
        } else if (col1 == col2){
            for (int i = row1; i <= row2; i++) {
                list.add(matrix[i][col1]);
            }
        } else {
            int curRow = row1;
            int curCol = col1;
            while (curCol < col2) {
                list.add(matrix[curRow][curCol++]);
            }
            while (curRow < row2) {
                list.add(matrix[curRow++][curCol]);
            }
            while (curCol > col1) {
                list.add(matrix[curRow][curCol--]);
            }
            while (curRow > row1) {
                list.add(matrix[curRow--][curCol]);
            }
        }
    }