(力扣) 00-从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

重点:

局部变量在函数结束时会自动删除,不能作为返回值,需要使用malloc 或者 static 才能在函数返回时不被删除

说到逆序 首先想到的就是递归,但是苦于作为函数的局部变量在函数结束时会自动删除,没有想到解决办法
看了别人的答案发现可以使用malloc 或者 static 解决

// 
int* reversePrint(struct ListNode* head, int* returnSize){
    if( head == NULL )
    {
        *returnSize = 0;
        return malloc(10000*sizeof(int));
    }
    int * res = reversePrint(head->next,returnSize);
    res[ (*returnSize)++] = head->val;
    return res;
}

基本步骤:

  • 1、动态建立数组 用于作为返回值;
  • 2、读取到数组
  • 3、数组逆序


/**
 * 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){
    struct ListNode* cur = head;
    int arr[10000];
    int *arr2 = (int *)malloc(10000*sizeof(int));
    int i = 0;
    while(cur != NULL)
    {
        arr[i] = cur->val;
        cur = cur -> next;
        i++;
    }
    *returnSize = i;
    for(int j =i-1 ,k = 0;j >= 0 ; j--,k++)
    {
        arr2[k] = arr[j];
    }
    return arr2;
}

在这里插入图片描述

int* reversePrint(struct ListNode* head, int* returnSize){
    struct ListNode* cur = head;
    int *arr = (int *)malloc(10000*sizeof(int));
    int i = 0;
    while(cur != NULL)
    {
        arr[i] = cur->val;
        cur = cur -> next;
        i++;
    }
    *returnSize = i;
    for(int j = 0 ; j< (*returnSize )/2;j++)
    {
        arr[j] = ( arr[i-1-j] + arr[j] ) - (arr[i-1-j] = arr[j]) ;
    }
    return arr;
}

在这里插入图片描述

------后面是一些废话

一开始调整数组交换方式发现时间消耗差的有点多,后来连续提交同一个代码才发现,每次运行时间会有差别,这就有点不太靠谱了

int* reversePrint(struct ListNode* head, int* returnSize){
    struct ListNode* cur = head;
    int *arr = (int *)malloc(10000*sizeof(int));
    int i = 0;
    while(cur != NULL)
    {
        arr[i] = cur->val;
        cur = cur -> next;
        i++;
    }
    *returnSize = i;
    for(int j = 0 ; j< (*returnSize )/2;j++)
    {
       // arr[j] = ( arr[i-1-j] + arr[j] ) - (arr[i-1-j] = arr[j]) ;
       int temp;
       temp = arr[j];
       arr[j] = arr[i-1-j];
       arr[i-1-j] = temp;
    }
    return arr;
}

修改了交换数组的方式 发现
在这里插入图片描述

连续两次提交运行时间不同,这就有点难受了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值