diff --git a/Spiral_Matrix.java b/Spiral_Matrix.java
new file mode 100644
index 00000000..0c953cad
--- /dev/null
+++ b/Spiral_Matrix.java
@@ -0,0 +1,108 @@
+class Spiral_Matrix {
+ public static void main(String[] args){
+ int[][] matrix = {{1,2,3},{4,5,6},{7,8,9}};
+ Spiral_Matrix ob = new Spiral_Matrix();
+ System.out.println(ob.spiralOrder(matrix));
+ }
+ public List<Integer> spiralOrder(int[][] matrix) {
+ ArrayList<Integer> ans = new ArrayList<>();
+ boolean[][] visited = new boolean[matrix.length][matrix[0].length];
+ int count = 0;
+ int row = 0;
+ int col = 0;
+ boolean right = true;
+ boolean left = false;
+ boolean down = false;
+ boolean up = false;
+ boolean curr = right;
+ while(count!=(matrix.length*matrix[0].length)){
+ if(!valid(row,col,matrix)){
+ if(curr==right){
+ col--;
+ row++;
+ down = true;
+ right = false;
+ curr = down;
+ }
+ else if(curr==left){
+ col++;
+ row--;
+ left = false;
+ up = true;
+ curr = up;
+ }
+ else if(curr==down){
+ col--;
+ row--;
+ down = false;
+ left = true;
+ curr = left;
+ }
+ else if(curr==up){
+ col++;
+ row--;
+ up = false;
+ right = true;
+ curr = right;
+ }
+ }
+ if(!visited(row,col,visited)){
+ visited[row][col] = true;
+ ans.add(matrix[row][col]);
+ count++;
+ if(right){
+ col++;
+ }
+ else if(left){
+ col--;
+ }
+ else if(down){
+ row++;
+ }
+ else if(up){
+ row--;
+ }
+ }
+ else{
+ if(curr==right){
+ col--;
+ row++;
+ down = true;
+ right = false;
+ curr = down;
+ }
+ else if(curr==left){
+ col++;
+ row--;
+ left = false;
+ up = true;
+ curr = up;
+ }
+ else if(curr==down){
+ col--;
+ row--;
+ down = false;
+ left = true;
+ curr = left;
+ }
+ else if(curr==up){
+ col++;
+ row++;
+ up = false;
+ right = true;
+ curr = right;
+ }
+ }
+
+ }
+ return ans;
+ }
+ private boolean valid(int r, int c, int[][] matrix){
+ boolean row = (r>=0)&&(r<matrix.length);
+ boolean col = (c>=0)&&(c<matrix[0].length);
+ return row&&col;
+ }
+ private boolean visited(int r, int c, boolean[][] mat){
+ return mat[r][c];
+ }
+}