剑指offer题解(C语言)----JZ06 从尾到头打印链表

题目

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

0 ≤链表长度≤10000

解析

其实看到这个题的第一个想法是链表的原地置逆...

但是思路上确实有比原地置逆更为简单的方式,也就是新开辟另一个数组,然后倒序遍历这个链表,把遍历到的值插入数组中,再输出数组。

代码

int* printListFromTailToHead(struct ListNode* listNode, int* returnSize ) {
     if(listNode == NULL){
        * returnSize = 0;
        return listNode;
     } //入参分析
    int list_length = 1;  //初始化链表长度,令其为1
    struct ListNode* head_copy;  //复制一个链表头节点的指针,用与计算链表长度
    head_copy = listNode;
    while( head_copy->next!=0 ){ //当头结点指针指向的结点不为0时,链表长度+1
        list_length++;
        head_copy = head_copy->next; //头结点指针后移一位
    }

    // 开辟空间
    int space = list_length*4; //int类型,*4
    int *array = (int *)malloc(space); //用malloc函数调用一块空间
    if(array == NULL) exit(1);  //若开辟空间失败则退出

    // 将链表中的值装载进去,倒过来赋值至数组
    for(int i=list_length-1; i>=0; --i){ //倒着遍历
        array[i] = listNode->val; //按倒序将值插入进去
        listNode = listNode->next; //指针后移一位
    }
   
    * returnSize = list_length;

    return array;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值