返回
剑指 Offer 面试题精选图解 06 . 从尾到头打印链表(附代码演示)
见解分享
2023-12-13 06:53:13
问题
给你一个链表的头节点 head
,请你反过来返回每个节点的值,以数组的形式返回。
示例
- 输入:
head = [1,2,3,4,5]
- 输出:
[5,4,3,2,1]
思路分析
这道题可以采用以下思路解决:
-
利用栈数据结构 : 栈是一种具有 先入后出(LIFO) 特点的数据结构。我们可以利用栈来存储链表中的节点,然后依次弹出栈中的节点,即可得到从尾到头的顺序。
-
利用递归 : 递归是一种函数调用自身的方法。我们可以利用递归来遍历链表,并在每次递归调用时将当前节点的值压入栈中。当递归到底时,栈中就存储了所有节点的值。然后我们可以依次弹出栈中的节点,即可得到从尾到头的顺序。
-
利用迭代 : 迭代是一种循环执行的过程。我们可以利用迭代来遍历链表,并在每次迭代时将当前节点的值压入栈中。当迭代到尾时,栈中就存储了所有节点的值。然后我们可以依次弹出栈中的节点,即可得到从尾到头的顺序。
代码实现
# 方法一:利用栈数据结构
def reverse_print_list(head):
stack = []
while head:
stack.append(head.val)
head = head.next
return stack[::-1]
# 方法二:利用递归
def reverse_print_list(head):
if not head:
return []
return reverse_print_list(head.next) + [head.val]
# 方法三:利用迭代
def reverse_print_list(head):
stack = []
while head:
stack.append(head.val)
head = head.next
res = []
while stack:
res.append(stack.pop())
return res
复杂度分析
-
时间复杂度 :
- 利用栈数据结构:O(n),其中 n 为链表的长度。
- 利用递归:O(n),其中 n 为链表的长度。
- 利用迭代:O(n),其中 n 为链表的长度。
-
空间复杂度 :
- 利用栈数据结构:O(n),其中 n 为链表的长度。
- 利用递归:O(n),其中 n 为链表的长度。
- 利用迭代:O(n),其中 n 为链表的长度。
总结
这道题考查了链表的遍历和栈/递归/迭代的使用。通过这道题,我们可以巩固链表的基础知识,以及熟悉栈/递归/迭代的用法。