如何在不新增函数的前提下修改循环链表的append与add_before方法去重
循环链表去重方案(仅修改append和add_before方法)
我来帮你搞定这个问题,完全符合你“不新增任何函数、只修改append和add_before”的要求。核心思路就是在这两个方法执行添加/插入操作前,先遍历链表检查元素是否已存在,存在就直接跳过操作,这样就能保证链表元素唯一。
首先,先补全你代码里缺失的基础部分(比如NodeDLL节点类和链表的打印方法,方便测试),然后重点展示修改后的两个目标方法:
完整可运行代码
class NodeDLL: def __init__(self, data): self.data = data self.next = None self.prev = None class CirList: def __init__(self): self.head_node = NodeDLL(None) # 哨兵头节点,data为None self.head_node.next = self.head_node self.head_node.prev = self.head_node # --- 以下是修改后的append方法 --- def append(self, data): # 先检查元素是否已存在于链表中 current = self.head_node.next while current != self.head_node: if current.data == data: return # 元素已存在,直接返回,不执行添加 current = current.next # 原有的append逻辑,仅当元素不存在时执行 new_node = NodeDLL(data) last_node = self.head_node.prev last_node.next = new_node new_node.prev = last_node new_node.next = self.head_node self.head_node.prev = new_node # --- 以下是修改后的add_before方法 --- def add_before(self, target_data, new_data): # 第一步:检查新元素是否已存在 current_check = self.head_node.next while current_check != self.head_node: if current_check.data == new_data: return # 新元素已存在,不执行插入 current_check = current_check.next # 原有的add_before逻辑:找到目标节点并插入 current = self.head_node.next while current != self.head_node: if current.data == target_data: new_node = NodeDLL(new_data) prev_node = current.prev prev_node.next = new_node new_node.prev = prev_node new_node.next = current current.prev = new_node return current = current.next # 辅助打印方法,方便验证结果 def __str__(self): result = [] current = self.head_node.next while current != self.head_node: result.append(str(current.data)) current = current.next return f"[{', '.join(result)}]"
关键修改点说明
- append方法:在创建新节点之前,先遍历整个循环链表(从哨兵节点的下一个节点开始,直到回到哨兵节点),如果发现和要添加的元素相同的节点,直接返回,不执行后续的添加操作。
- add_before方法:先做和append一样的重复检查,确保要插入的新元素不存在;只有确认不存在后,才继续执行原来的查找目标节点并插入的逻辑。
- 全程没有新增任何函数,完全是在原有两个方法内部修改,满足你的要求。
测试验证
运行下面的测试代码:
cl = CirList() cl.append(5) cl.append(3) cl.append(3) # 重复元素,不会被添加 cl.add_before(5, 3) # 要插入的3已存在,不会被插入 print(cl) # 输出:[5, 3]
这样就能得到你想要的无重复元素的链表结果啦。
内容的提问来源于stack exchange,提问作者mini
相关产品推荐
相关产品推荐

