Python实现约瑟夫环算法时的NoneType错误原因咨询
为什么初始化两个独立Node会导致AttributeError?
咱们直接说核心问题:你最初写prev=Node(0)和head=Node(0)时,这是两个完全不相关的Node对象,它们各自的next属性默认都是None——这就是触发后续报错的根源。
错误写法的执行流程(prev和head是两个独立节点)
- 初始化
prev=Node(0)和head=Node(0),此时:- prev的
next是None - head的
next也是None
- prev的
- 进入for循环创建1到5的节点(以n=6为例):
每次循环把prev的next指向新节点,然后prev移动到新节点。循环结束后,prev指向最后一个节点(Node(5)),你执行prev.setNext(head)——这时候Node(5)的next指向了head,但head的next仍然是None,从来没被修改过。 - 进入while循环,初始currentNode是head:
第一次判断currentNode.getNext() != currentNode,也就是None != head,条件成立,进入循环。 - 假设m=3,第一次循环counter从0变成1,不等于3,于是
prev=currentNode(也就是prev现在指向head),currentNode=currentNode.getNext()(也就是currentNode变成了None)。 - 下一次while循环判断
currentNode.getNext()时,currentNode是None,自然就抛出AttributeError: 'NoneType' object has no attribute 'getNext'了。
正确写法的执行流程(prev=head,指向同一个节点)
- 初始化
head=Node(0),然后prev=head——此时prev和head是同一个Node实例,共享同一个next属性。 - 进入for循环创建1到5的节点:
第一次循环创建Node(1),prev.setNext(currentNode)也就是给head的next设置为Node(1),然后prev移动到Node(1)。后续循环依次把每个新节点连到前一个节点的next上,最终prev指向Node(5)。 - 执行
prev.setNext(head),把Node(5)的next连回head,形成一个完整的循环链表——此时每个节点的next都指向有效的Node对象,没有None存在。 - 后续的while循环可以正常遍历,因为currentNode的
getNext()永远返回一个有效的Node,不会出现None的情况,自然不会触发错误。
你可以自己验证一下:在错误写法里加一句print(head is prev),会输出False;而正确写法里会输出True——这就能直观看到两者是否是同一个对象。
内容的提问来源于stack exchange,提问作者user6126396
相关产品推荐
相关产品推荐

