题目
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
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;
}