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
相关产品推荐
相关产品推荐

