You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不新增函数的前提下修改循环链表的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:01:01