⭐️前面的话⭐️
大家好!博主开辟了一个新的专栏——剑指offer,我要开始刷题了!这个专栏会介绍《剑指offer》书上所有的面试编程题。并且会分享一些我的刷题心得。由于博主水平有限,如有错误,欢迎指正,如果有更好的解题思路和算法可以分享给博主哦!一起加油!一起努力!
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2021年9月3日🌴
✉️坚持和努力一定能换来诗与远方!
💭参考书籍:📚《剑指offer第1版》,📚《剑指offer第2版》
💬参考在线编程网站:🌐牛客网🌐力扣
🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
博主的码云gitee,平常博主写的程序代码都在里面。
⭐️剑指 Offer 06. 从尾到头打印链表⭐️
🔐题目详情
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/
💡解题思路
方法1: 先求链表长度,然后再将链表中的元素逆序存入数组中。
时间复杂度: O(N)
方法2: 先反转链表并求长度,在将反转后的链表数据拷贝至数组中。
反转链表方法见剑指offer系列——剑指 Offer 24. 反转链表(C语言)
时间复杂度: O(N)
🔑源代码
编程语言:C语言
在线编程平台:力扣
//方法1
/**
* 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){
int cnt = 0;
struct ListNode* cur = NULL;
cur = head;
while(cur)
{
cnt++;
cur = cur->next;//求链表中元素个数
}
int* arr = (int*)malloc(sizeof(int)*cnt);//分配给数组合适的空间
*returnSize = cnt;
cur = head;
while(cur)
{
*(arr + cnt - 1) = cur->val;//将链表的元素逆向存入数组中
cur = cur->next;
cnt--;
}
return arr;
}
//方法2
int* reversePrint(struct ListNode* head, int* returnSize){
if (head == NULL)
{
*returnSize = 0;
return NULL;
}
int cnt = 0;//记录元素个数
struct ListNode* cur = head;
struct ListNode* next = NULL;
struct ListNode* tail = NULL;
while (cur)
{
next = cur->next;
cur->next = tail;
tail = cur;
cur = next;
cnt++;
}//反转链表并求链表长度
int* arr = (int*)malloc(sizeof(int)*cnt);
*returnSize = cnt;
cur = tail;
int i = 0;
for (i = 0; i < cnt; i++)
{
arr[i] = cur->val;
cur = cur->next;
}
return arr;
}
🌱总结
对于链表的逆序打印,可以先统计链表元素个数,然后根据链表元素个数创建合适大小的数组,最后再将链表中的元素逆序存入数组中!还可以先进行反转链表并求出链表元素个数,同理根据链表大小为数组申请空间,最后将反转链表中的元素存入数组中!