import java.util.ArrayList;
public class Solution {
    // 四中状态的
    enum Status {
        LeftToRight, TopToBottom, RightToLeft, BottomToTop
    }

    private int[][] init(int row, int col) {
        int[][] visited = new int[row][col];
        for (int i = 0; i < visited.length; i++) {
            for (int j = 0; j < visited[0].length; j++) {
                visited[i][j] = 0; // unvisited
            }
        }
        return visited;
    }

    private boolean hasUnVisitedElement(int[][] visited) {
        for (int i = 0; i < visited.length; i++) {
            for (int j = 0; j < visited[0].length; j++) {
                if (visited[i][j] == 0) return true;
            }
        }
        return false;
    }

    public ArrayList<Integer> spiralOrder(int[][] matrix) {
        ArrayList<Integer> result = new ArrayList<>();
        if(matrix.length==0) return result;
        else if(matrix.length == 1){
            for (int i = 0; i < matrix[0].length; i++) {
                result.add(matrix[0][i]);
            }
            return result;
        }
        // 定义状态序列
        Status[] arrs = new Status[]{Status.LeftToRight, Status.TopToBottom, Status.RightToLeft, Status.BottomToTop};
        int currentStatus = 0; // 定义状态指针
        // 初始化访问矩阵
        int[][] visited = init(matrix.length, matrix[0].length);

        int left = -1, right = matrix[0].length, top = -1, bottom = matrix.length;

        // 还有未访问的就继续
        while (hasUnVisitedElement(visited)) {
            switch (arrs[currentStatus]) {
                case LeftToRight:
                    left++;
                    top++;
                    for (int i = left; i < right - 1; i++) {
                        if(visited[top][i] == 0){
                            result.add(matrix[top][i]);
                            visited[top][i] = 1; // 访问过
                        }
                    }
                    break;
                case TopToBottom:
                    right--;
                    bottom--;
                    for (int i = top; i < bottom; i++) {
                        if(visited[i][right] == 0){
                            result.add(matrix[i][right]);
                            visited[i][right] = 1;
                        }
                    }
                    break;
                case RightToLeft:
                    for (int i = right; i > left - 1; i--) {
                        if(visited[bottom][i] == 0){
                            result.add(matrix[bottom][i]);
                            visited[bottom][i] = 1;
                        }
                    }
                    break;
                case BottomToTop:
                    for (int i = bottom - 1; i > top; i--) {
                        if(visited[i][left] == 0){
                            result.add(matrix[i][left]);
                            visited[i][left] = 1;
                        }
                    }
                    break;
            }
            currentStatus = (currentStatus + 1) % arrs.length;
        }
        return result;
    }
}

值得注意的是,需要导入ArrayList的包才行。