返回

深度解析LeetCode刷题【从尾到头打印链表】,从面试官角度抽丝剥茧

后端

从面试官的角度出发,带你一步步剖析LeetCode【从尾到头打印链表】,深入浅出,通俗易懂。在学习算法数据结构的过程中,我们常常遇到各种经典题,而LeetCode作为算法学习者的必备平台,更是汇聚了众多经典难题。

一、题目

题目来源:LeetCode>从尾到头打印链表

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

二、解题思路

这道题看似复杂,其实本质上是一个反转链表的过程。我们可以通过两种方式来解决这个问题:

  1. 递归法: 从头节点开始,将链表依次反转,最后返回反转后的链表头节点。
  2. 非递归法: 使用栈或队列等数据结构,将链表的节点逐个压入栈或入队,然后再依次弹出或出队,即可得到反转后的链表。

三、代码实现

# -*- coding: utf-8 -*-

# Definition for singly-linked list.
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution(object):
    # 递归法
    def reversePrint1(self, head):
        if not head:
            return []
        result = self.reversePrint1(head.next)
        result.append(head.val)
        return result

    # 非递归法
    def reversePrint2(self, head):
        stack = []
        while head:
            stack.append(head.val)
            head = head.next
        result = []
        while stack:
            result.append(stack.pop())
        return result


if __name__ == "__main__":
    head = ListNode(1)
    head.next = ListNode(2)
    head.next.next = ListNode(3)
    head.next.next.next = ListNode(4)
    head.next.next.next.next = ListNode(5)

    solution = Solution()
    print(solution.reversePrint1(head))
    print(solution.reversePrint2(head))

四、扩展思考

  1. 如何优化反转链表的算法,降低时间复杂度和空间复杂度?
  2. 如何将反转链表作为子程序,应用到其他算法和数据结构中?
  3. 如何将反转链表的概念扩展到其他领域,如字符串反转、数组反转等?

五、总结

本篇文章详细讲解了LeetCode中的经典题目【从尾到头打印链表】,从题目到解题思路再到代码实现,一步步带领读者深入理解反转链表的算法原理。通过对这道题的学习,读者可以加深对链表数据结构的理解,提高算法编程能力,为面试和实际工作打下坚实的基础。