链表实现队列的递归反转问题排查
问题分析与解决
你的递归反转队列函数存在两个关键错误,导致反转逻辑完全未执行:
1. 递归终止条件判断错误
原函数中的if not queue:是判断队列对象本身是否为None,但你传入的q是有效的Queue_LL实例,这个条件永远不会成立,递归代码块根本不会被触发,队列自然没有任何变化。
正确的终止条件应该是判断队列是否为空,调用队列的isEmpty()方法:if queue.isEmpty(): return
2. 递归逻辑执行顺序错误
原代码把弹出、递归、入队的逻辑写在了错误的分支里,完全搞反了逻辑。正确逻辑是:当队列不为空时,先弹出队首元素,递归反转剩余队列,再将弹出的元素入队到反转后的队列尾部。
修正后的递归函数
def reverse(queue): # 终止条件:队列为空时直接返回 if queue.isEmpty(): return # 弹出当前队首元素 temp = queue.dequeue() # 递归反转剩余的队列 reverse(queue) # 将弹出的元素加入反转后的队列尾部 queue.enqueue(temp)
验证结果
运行修正后的代码,反转后的队列输出将符合你的预期:
q.getFront()返回50(原队尾元素)q.getRear()返回20(原队首元素)q.size()返回4(元素数量保持不变)q.isEmpty()返回False(队列非空)
递归执行过程说明
以测试队列[20,30,40,50]为例:
- 第一次调用
reverse(q):弹出20,递归处理剩余队列[30,40,50] - 第二次调用
reverse(q):弹出30,递归处理剩余队列[40,50] - 第三次调用
reverse(q):弹出40,递归处理剩余队列[50] - 第四次调用
reverse(q):弹出50,递归处理空队列,触发终止条件返回 - 第四次调用结束,将50入队,队列变为
[50] - 第三次调用结束,将40入队,队列变为
[50,40] - 第二次调用结束,将30入队,队列变为
[50,40,30] - 第一次调用结束,将20入队,队列变为
[50,40,30,20],完成反转
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

