返回

剑指 Offer 面试题精选图解 06 . 从尾到头打印链表(附代码演示)

见解分享

问题

给你一个链表的头节点 head,请你反过来返回每个节点的值,以数组的形式返回。

示例

  • 输入:head = [1,2,3,4,5]
  • 输出:[5,4,3,2,1]

思路分析

这道题可以采用以下思路解决:

  1. 利用栈数据结构 : 栈是一种具有 先入后出(LIFO) 特点的数据结构。我们可以利用栈来存储链表中的节点,然后依次弹出栈中的节点,即可得到从尾到头的顺序。

  2. 利用递归 : 递归是一种函数调用自身的方法。我们可以利用递归来遍历链表,并在每次递归调用时将当前节点的值压入栈中。当递归到底时,栈中就存储了所有节点的值。然后我们可以依次弹出栈中的节点,即可得到从尾到头的顺序。

  3. 利用迭代 : 迭代是一种循环执行的过程。我们可以利用迭代来遍历链表,并在每次迭代时将当前节点的值压入栈中。当迭代到尾时,栈中就存储了所有节点的值。然后我们可以依次弹出栈中的节点,即可得到从尾到头的顺序。

代码实现

# 方法一:利用栈数据结构
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 为链表的长度。

总结

这道题考查了链表的遍历和栈/递归/迭代的使用。通过这道题,我们可以巩固链表的基础知识,以及熟悉栈/递归/迭代的用法。