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

如何设置首节点prev指向尾节点next构建循环双向链表解决约瑟夫问题报错

问题解答

1 你的报错原因判断是否正确?

你的判断不准确。本次报错的直接原因是:第一次调用insert_after方法插入第2个节点时,传入的首节点current_node的next属性初始值为None,你把x.next赋值给z后,z就是None,执行z.prev = y时自然会抛出NoneType没有prev属性的错误。

你提到的「首节点prev未设置、循环双向链表首尾未关联」属于后续运行会触发的问题,但不是本次报错的直接诱因。

修复方向:

  • 先修正insert_after方法的空指针访问问题
  • 所有节点插入完成后手动关联首尾节点,完成双向循环结构的构建
  • 同步修正约瑟夫环的计数逻辑、循环终止条件的漏洞

2 完整可运行修复方案

修正后的代码如下:

class Student:
    # 初始化节点
    def __init__(self, data):
        self.data = data
        self.next = None
        self.prev = None
        
    def remove(self, n):
        print("Student " +str(n)+ " was removed")
        
class Circle:
    # 初始化双向链表
    def __init__(self):
        self.head = None
        self.tail = None
    # 在x节点后插入新节点           
    def insert_after(self, x, data):          
        y = Student(data)
        z = x.next
        
        y.prev = x
        y.next = z
        x.next = y
        # 仅当z不为空时才修改z的prev属性,避免空指针报错
        if z is not None:
            z.prev = y
        return y
    
    def josephus_solution(self, n, k):
        no_of_active_nodes = n
        # 初始化首节点
        head = Student(1)
        current_node = head
        # 插入剩余n-1个节点,同时记录尾节点
        for i in range(2, n + 1):
            current_node = self.insert_after(current_node, i)
        tail = current_node
        # 首尾关联,构建循环双向链表
        head.prev = tail
        tail.next = head
        # 重置当前节点到首节点,初始化计数器
        current_node = head
        count = 0
        while no_of_active_nodes > 1:
            count += 1
            if count == k:
                current_node.remove(current_node.data)
                # 移除当前节点
                current_node.prev.next = current_node.next
                current_node.next.prev = current_node.prev
                no_of_active_nodes -= 1
                count = 0
            # 移动到下一个节点
            current_node = current_node.next
        print("Student " + str(current_node.data) + " Recieves the scholarship")
        return current_node.data

dllist = Circle()
n = 5 
k = 2 
ans = dllist.josephus_solution(n, k)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:39:03