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

Python双链表LDL类reverseSwap方法中Node对象访问data属性报错求助

问题根因

你的报错由三类错误共同导致,和Node对象创建逻辑无关:

  • 拼写错误:计数变量名前后不一致,你定义的变量是counter,累加时写的是conter +=1,后续循环范围写的是int(cont/2),三个变量名完全不匹配。
  • 尾节点赋值错误:你遍历到真实尾节点存在nodeCurrent中,但始终没有把nodeLast赋值为这个真实尾节点,全程操作的是初始化时新建的孤立空Node对象,该对象的nextLeft属性默认为None,第一次循环移动指针后nodeLast就变成None,下一次访问nodeLast.data直接触发属性不存在报错。
  • 缺失边界判断:没有处理空链表、链表仅1个节点的场景,直接访问节点属性会触发空指针报错。

修复后的代码

from typing import Optional

class Node:
    def __init__(self, data, nextLeft: Optional['Node']=None, nextRight: Optional['Node']=None):
        self.data = data
        self.nextLeft = nextLeft
        self.nextRight = nextRight

class LDL:
    def __init__(self, head: Optional[Node] = None):
        self.head = head

    def insertAtEnd(self, dataToInsert):
        # 你的原有实现
        pass

    def reverseSwap(self):
        # 边界判断:空链表/只有1个节点无需交换
        if not self.head or not self.head.nextRight:
            return
        
        left_ptr = self.head
        right_ptr = self.head
        node_count = 0

        # 遍历获取尾节点和总节点数
        while right_ptr.nextRight:
            right_ptr = right_ptr.nextRight
            node_count += 1

        # 仅需循环半长即可完成所有对称交换
        for _ in range((node_count + 1) // 2):
            # 交换节点值
            left_ptr.data, right_ptr.data = right_ptr.data, left_ptr.data
            # 移动指针
            left_ptr = left_ptr.nextRight
            right_ptr = right_ptr.nextLeft

编辑器不提示属性的解决方法

Python是动态类型语言,你的self.head初始化默认值为None,编辑器无法推断运行时self.head的实际类型,所以不会给出补全提示。给属性、参数加上上述代码中的类型标注后,编辑器就能正确识别Node类型的属性和方法了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:57:03