输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
作者:Krahets
链接:https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/5dt66m/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
通过先把链表逆序,在逆序过程中同时统计链表节点的数量;申请链表节点数量的数据,然后再依次遍历链表,将链表中的节点值域的值赋值给数据;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* listReverse(struct ListNode *head, int *returnSize)
{
if (!head)
{
*returnSize = 0;
return NULL;
}
struct ListNode *pre = head;
struct ListNode *cur = pre->next;
struct ListNode *nex;
int NodeNum = 1;
while(cur)
{
nex = cur->next;
cur->next = pre;
pre = cur;
cur = nex;
NodeNum ++;
}
head->next = NULL;
head = pre;
*returnSize = NodeNum;
return head;
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* reversePrint(struct ListNode* head, int* returnSize){
struct ListNode *pf = listReverse(head, returnSize);
int i = 0;
printf("*returnSize:%d\n", *returnSize);
int *res = (int *)malloc(sizeof(int) * (*returnSize));
while(pf) {
res[i++] = pf->val;
pf = pf->next;
}
return res;
}