剑指 Offer 06. 从尾到头打印链表

剑指 Offer 06. 从尾到头打印链表

题目来源: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;
}

这个代码应该不是最优,在力扣上看到有人提出先原地反转链表,反转链表的同时获取节点数量,然后再申请数组,遍历拷贝节点数据

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×