题目来源:LeetCode
1. 题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
2. 思考
- 从尾到头反过来输出节点值,且用数据返回,那么就需要申请数组空间
- 要申请数据空间则需要知道链表长度,则需要遍历一遍链表,获取节点个数
- 从尾到头反过来输出,由此联想到一种数据结构,栈,先进后出
- 可以遍历链表,从头节点开始压入栈中,然后再逐个出栈,就相当于从尾到头输出
栈的结构特性与此题目正好吻合,有一些博主使用java等语言内置的栈结构,可以方便解题,但是如果使用C语言,则可以不用模拟出栈结构,可以利用其思想,即栈是从尾部逐个向下入栈,在本题中,知道节点个数后,就可以申请数组长度,然后可以从数组尾部逐个存入节点值,即链表头部存入数组长度-1位置,以此类推,链表头存在数组0位置:
3. 代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* reversePrint(struct ListNode* head, int* returnSize){
int len = 0;
struct ListNode* tmp = head;
for(;tmp!=NULL; tmp = tmp->next,++len){
;
}
if(!len){
*returnSize = len;
return NULL;
}
int * data = (int*)malloc(len*sizeof(int));
if(data == NULL) return NULL;
*returnSize = len;
for(tmp = head; tmp != NULL; tmp = tmp->next){
data[--len] = tmp->val;
}
return data;
}
这个代码应该不是最优,在力扣上看到有人提出先原地反转链表,反转链表的同时获取节点数量,然后再申请数组,遍历拷贝节点数据