[AcWing]17. 从尾到头打印链表
[AcWing]17. 从尾到头打印链表
输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值。
返回的结果用数组存储。
数据范围
0 ≤
链表长度 ≤ 1000
。
样例
1 |
|
算法思想
最简单的方法就是,直接遍历链表,然后存入vector
,再利用库函数将其反转输出。
所以此处只写一下,递归函数法。
还是利用递归栈,出栈的时候将节点值塞入vector
,这样就是逆序的了。
代码实现
1 |
|
思考
1 |
|
假设链表元素是:[1, 2]
。
它的函数调用栈压栈顺序是:printListReversingly(1)
、printListReversingly(2)
、printListReversingly(NULL)
。
它的出栈顺序是:printListReversingly(NULL)
、printListReversingly(2)
、printListReversingly(1)
当执行到printListReversingly(2)
的时候,ans.push_back(2)
之后,接下来会执行return ans
,那么为什么没有终止掉递归?
return ans
只是终止掉了属于printListReversingly(2)
的这一层递归,还剩printListReversingly(1)
的递归。最终ans
里面的元素会是[2, 1]
。
对于这道题来说,外部肯定有一个变量接收最后的ans = [2, 1]
。
第二个问题来了同时也是最重要的一个问题:
为什么printListReversingly函数在递归过程中返回了多次,为什么第一次返回的时候没有将集合传给外部那个变量?
ans
已经包含了所有逆序的元素
类似于main函数中写:auto a = printListReversingly(list);
,当a收到返回的ans的时候,函数递归早已经结束了。
有如下规律:
1 |
|