TestDome重复播放列表问题:is_repeating_playlist函数报错求助
问题分析与修复方案
你的代码存在几个关键问题,导致测试不通过:
1. 返回值类型错误
题目要求返回布尔值True/False,但你返回的是字符串"True"/"False",这会被判定为非预期结果。
2. 仅处理了两节点循环的特殊情况
问题定义中,只要播放列表存在任意循环(不管循环长度是2还是更长),都属于重复播放列表。比如三首歌A→B→C→A的循环,你的代码完全无法检测到;同时如果播放列表是正常结束(最后一首歌指向None),你的代码会因为访问self.next.next而抛出AttributeError(当self.next是None时)。
3. 未处理边界情况
比如只有一首歌且指向自己,或者只有一首歌指向None的情况,你的代码也无法正确处理。
修复后的高效实现
可以使用快慢指针法(龟兔赛跑算法),时间复杂度O(n),空间复杂度O(1),能高效检测所有循环情况:
class Song: def __init__(self, name): self.name = name self.next = None def next_song(self, song): self.next = song def is_repeating_playlist(self): """ :returns: (bool) True if the playlist is repeating, False if not. """ slow = self fast = self while fast is not None and fast.next is not None: slow = slow.next fast = fast.next.next # 快慢指针相遇,说明存在循环 if slow is fast: return True # 遍历到None,说明无循环 return False
测试验证
用你的示例测试:
first = Song("Hello") second = Song("Eye of the tiger") first.next_song(second) second.next_song(first) print(first.is_repeating_playlist()) # 输出 True
其他测试场景:
- 单首歌指向自己:返回True
- 三首歌循环A→B→C→A:返回True
- 正常链A→B→C→None:返回False
内容的提问来源于stack exchange,提问作者Shalini
相关产品推荐
相关产品推荐

