剑指 Offer 06. 从尾到头打印链表

剑指 Offer 06. 从尾到头打印链表

题目大意

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

示例 1:

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

解题思路

  1. 修改链表结构, 前向连接改成后向连接, 然后从头向后打印
  2. 先遍历链表, 将数值保存到栈中, 然后弹栈打印
  3. 既然想到了用栈来实现这个函数,而递归在本质上就是一个栈结构,于是很自然地又想到了用递归来实现

上面的基于递归的代码看起来很简洁,但有个问题:当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用技溢出。 显式用栈基于循环实现的代码的鲁棒性要好一些。更多关于循环和递归的讨论,详见本书的2.4.2节

考察内容

  1. 考查对单项链表的理解和编程能力
  2. 考查对循环、递归和栈 3 个相互关联的概念的理解

方法1: 基于栈存储

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

class Solution(object):
    def reversePrint(self, head):
        """
        :type head: ListNode
        :rtype: List[int]
        """
        if not head:
            return []
        stack, res = [], []
        node = head
        while node:
            stack.append(node.val)
            node = node.next
        while stack:
            res.append(stack.pop())
        return res

方法2: 基于递归打印

下述代码的递归函数写成成员方法试试? 能不能仅仅递归reversePrint函数, 也试试?

class Solution(object):
    def reversePrint(self, head):
        """
        :type head: ListNode
        :rtype: List[int]
        """
        def recursion(head, res):
            if head.next != None:
                recursion(head.next, res)
            res.append(head.val)

        res = []
        if not head:
            return []
        else:
            recursion(head, res)
            return res   
posted @ 2022-08-17 10:45  别把梦弄脏  阅读(89)  评论(0)    收藏  举报