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

循环链表手动创建节点后调用atStart函数添加首节点失败问题

循环链表头部添加节点失效问题修复

问题核心原因

  1. 手动构建链表时未初始化tail属性:你手动创建3个节点并关联后,没有将cll.tail指向最后一个节点e3,导致atStart中处理非空链表的代码块(if self.tail:)因条件不满足而跳过,新节点根本没被加入链表。
  2. 原atStart未更新头部指针:即使tail正确初始化,原函数也没把self.head更新为新节点,打印时仍从旧头部开始遍历,无法访问到新添加的节点。

修复后的完整代码

class Node:
    def __init__(self, data):
        self.data = data
        self.ref = None

class CircularLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    def atStart(self, newData):
        newNode = Node(newData)

        if self.head is None:
            # 空链表:新节点既是头也是尾,自循环
            self.head = newNode
            self.tail = newNode
            self.tail.ref = newNode
        else:
            # 非空链表:插入新节点到头部
            newNode.ref = self.tail.ref  # 新节点指向原头部
            self.tail.ref = newNode      # 尾节点指向新节点,完成循环
            self.head = newNode          # 更新头部指针为新节点

    def printList(self):
        if self.head is None:
            print("Circular linked list is empty")
            return
        current = self.head
        while True:
            print(current.data)
            current = current.ref
            if current == self.head:
                break

# 测试代码
cll = CircularLinkedList()
cll.head = Node("Monday")
e2 = Node("Tuesday")
e3 = Node("Wednesday")

cll.head.ref = e2
e2.ref = e3
e3.ref = cll.head
cll.tail = e3  # 必须手动设置tail,否则atStart无法识别非空状态

cll.atStart("Sunday")
cll.atStart("New Monday")
cll.printList()

关键修复点说明

  • 补全手动构建的tail初始化:添加cll.tail = e3,让链表的tail属性正确指向最后一个节点,确保atStart能进入非空链表处理逻辑。
  • 更新头部指针:在非空链表的处理分支中新增self.head = newNode,这样打印时会从新添加的节点开始遍历,完整输出所有节点。
  • 优化遍历逻辑:将printList的循环改为while True,结合current == self.head的终止条件,更贴合循环链表的遍历特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:10:29