c++ 链表长度_从尾到头打印链表(剑指offer第四题)

61c69be984c99ffdae35c20b71084d8b.png

从尾到头打印链表

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

示例 1:
输入:head = [1,3,2]
输出:[2,3,1]

限制:
0 <= 链表长度 <= 10000

解题思路

看到题目后首先想到的就是C++中stl提供的反转(reverse)算法,先遍历整个链表,将每个结点的数据都尾插到vector容器中,当遍历完之后将整个容器反转,这样就能解出此题了。

1.反转代码

代码如下:

class 

2.借助deque容器实现

当用完自带的反转算法解完题后,我又尝试着运用vector+deque两个容器来实现算法。因为vector容器的弊端就是头插比较麻烦,而deque容器则能完美的解决头插的问题。首先将链表遍历并将每个结点的数据都头插到deque容器中,最后遍历完成后将deque容器里的数据都复制给vector容器,最后返回vector。
代码如下:

class 

结论:可以看到这种解法没有第一种那么理想。这说明人家标准库里提供的算法都是大佬们精心优化过的,就是牛逼…(能用标准库里的算法就尽量使用)

拓展

看了官方给的答案发现还有很多好的解法,这里我也拿过来给大家参考。

递归实现

代码如下:

class 

复杂度分析
时间复杂度:O(n)O(n),递归 nn 次,时间间复杂度为 O(n)O(n),递归函数中的操作时间复杂度为 O(1)O(1),总时间复杂度为 O(n)times O(1)=O(n)O(n)×O(1)=O(n)。
空间复杂度:O(n)O(n),递归将占用链表长度的栈空间。

堆栈实现

代码如下:

class 

复杂度分析
时间复杂度:O(n)O(n),pushpush 的间复杂度为 O(n)O(n),poppop 的间复杂度为 O(n)O(n)。
空间复杂度:O(n)O(n),使用了额外的 res 和 堆栈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值