剑指 Offer 06. 从尾到头打印链表
题目大意
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
解题思路
- 修改链表结构, 前向连接改成后向连接, 然后从头向后打印
- 先遍历链表, 将数值保存到栈中, 然后弹栈打印
- 既然想到了用栈来实现这个函数,而递归在本质上就是一个栈结构,于是很自然地又想到了用递归来实现
上面的基于递归的代码看起来很简洁,但有个问题:当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用技溢出。 显式用栈基于循环实现的代码的鲁棒性要好一些。更多关于循环和递归的讨论,详见本书的2.4.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

浙公网安备 33010602011771号