输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
解法一
C语言,遍历链表,将节点值存入数组,反转数组。
反转数组有两种方法:①使用for循环,循环到i/2处,将每个值和count-i进行交换②1. 设置left和right,分别为第一个和数组最后一个的下标,当right大于left,将arr[left]和arr[right]的值进行交换,移动指针。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* reversePrint(struct ListNode* head, int* returnSize){
if(head == NULL)
{
*returnSize = 0;
return 0;
}
int cnt = 0;
int* returnArray = (int*)malloc(sizeof(int)*10000);
memset(returnArray, 0, 10000 * sizeof(int));
struct ListNode*ptr = head;
for(ptr;ptr;ptr = ptr->next)
{
returnArray[cnt++] = ptr->val;
}
for(int i = 0;i < cnt/2;i++)
{
int temp = returnArray[i];
returnArray[i] = returnArray[cnt -1 - i];
returnArray[cnt -1 - i] = temp;
}
*returnSize = cnt;
return returnArray;
}
记得给returnSize赋值。malloc得到的动态数组要初始化。
时间复杂度O(n),空间复杂度O(1)。
解法二
递归or利用栈(先入后出)。
//链表的后序遍历, 套模板
void printValue(struct ListNode*head,int *res,int*returnSize)
{
if(head == NULL) return; //递归终止条件
printValue(head->next,res,returnSize);
res[(*returnSize)++] = head->val; //输出
return;
}
int* reversePrint(struct ListNode* head, int* returnSize){
*returnSize = 0;
if(head == NULL) return 0;
int *res = (int*)malloc(sizeof(int) * 10000);
printValue(head,res,returnSize);
return res;
}
时间复杂度O(n),空间复杂度O(n)。