1.题目要求 :
c
给你两个整数:m 和 n ,表示矩阵的维数。
另给你一个整数链表的头节点 head 。
请你生成一个大小为 m x n 的螺旋矩阵,矩阵包含链表中的所有整数。链表中的整数从矩阵 左上角 开始、顺时针 按 螺旋 顺序填充。如果还存在剩余的空格,则用 -1 填充。
返回生成的矩阵。
2.题目代码:
c
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** spiralMatrix(int m, int n, struct ListNode* head, int* returnSize, int** returnColumnSizes) {
//创造数组,存入链表结点值
int* number = (int*)malloc(sizeof(int) * (m * n));
int j = 0;
struct ListNode* cur = head;
//遍历链表,把链表的结点值存入数组中
while(cur){
number[j] = cur->val;
j++;
cur = cur->next;
}
//如果链表的结点数小于二维数组的元素数,后面补-1;
while(j < (m * n)){
number[j] = -1;
j++;
}
int row = m;
int col = n;
int i = 0;
//创造二维数组
int** mat = (int**)malloc(sizeof(int*) * m);
for(i = 0;i < m;i++){
mat[i] = (int*)malloc(sizeof(int) * n);
}
i = 0;
j = 0;
int f = 0;
//开始进行螺旋遍历
while(f < (m * n)){
int i1 = i;
int j1 = j;
while(j1 < col){
mat[i1][j1] = number[f];
f++;
j1++;
}
if(f >= (m * n)){
break;
}
j1--;
i1++;
while(i1 < row){
mat[i1][j1] = number[f];
f++;
i1++;
}
if(f >= m * n){
break;
}
i1--;
j1--;
while(j1 >= j){
mat[i1][j1] = number[f];
f++;
j1--;
}
if(f >= m * n){
break;
}
j1++;
i1--;
while(i1 > i){
mat[i1][j1] = number[f];
f++;
i1--;
}
if(f >= m * n){
break;
}
i++;
j++;
row--;
col--;
}
//返回二维数组
*returnSize = m;
*returnColumnSizes = (int*)malloc(sizeof(int) * m);
for(i = 0;i < m;i++){
(*returnColumnSizes)[i] = n;
}
return mat;
}