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

链表实现栈的__len__函数报错:'Stack'对象无'size'属性

解决链表实现栈的__len__方法报错问题

嘿,我来帮你搞定这个问题~你遇到的'Stack' object has no attribute 'size'错误原因很直白:你的Stack类里根本没定义size这个属性,所以__len__方法里直接返回self.size肯定会触发属性不存在的报错。

下面给你两种可行的解决方案,按需选择就行:

方案1:维护一个size计数器(推荐,O(1)时间复杂度)

这种方法是在栈初始化时就创建一个size变量,每次执行入栈(push)或出栈(pop)操作时更新这个变量,__len__方法直接返回它,效率很高。

修改后的完整代码如下:

class Node: 
    """链表的节点类。"""
    def __init__(self, item):
        self.item = item
        self.next_node = None

class Stack(object):
    def __init__(self):
        self.head = None
        # 新增:初始化size为0
        self.size = 0

    def push(self, item):
        """入栈操作:把元素放到栈顶"""
        new_node = Node(item)
        new_node.next_node = self.head
        self.head = new_node
        # 入栈后size加1
        self.size += 1

    def pop(self):
        """出栈操作:移除并返回栈顶元素"""
        if self.is_empty():
            raise IndexError("Pop from empty stack")
        popped_item = self.head.item
        self.head = self.head.next_node
        # 出栈后size减1
        self.size -= 1
        return popped_item

    def is_empty(self):
        """判断栈是否为空"""
        return self.head is None

    def __len__(self):
        """返回栈的长度——调用len(s)会触发此方法"""
        return self.size

方案2:遍历链表计算长度(O(n)时间复杂度)

如果你不想维护额外的size变量,也可以在__len__方法里直接遍历整个链表,统计节点的数量。不过这种方法每次调用len()都要遍历一遍链表,效率会低一些,适合栈元素不多的场景。

修改后的__len__方法如下:

def __len__(self):
    """返回栈的长度——调用len(s)会触发此方法"""
    count = 0
    current_node = self.head
    while current_node is not None:
        count += 1
        current_node = current_node.next_node
    return count

小提醒

如果用方案1,记得在pop方法里判断栈是否为空,避免出现size变成负数的情况(比如上面代码里加了is_empty判断和异常抛出)。

内容的提问来源于stack exchange,提问作者Magic_Whizz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:27:28