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

Python单链表数字加1代码异常求助:输出None问题排查

单链表加一功能错误排查

我有一个存储数字1999的单链表,反转后得到9991。但调用add_one函数时输出结果为None,预期执行add_one后应得到0002,再次反转后得到2000。请帮忙排查以下代码的错误所在:

class Node:
    def __init__(self, value):
        self.value= value
        self.next = None
        
class LinkedList:
    def __init__(self,value):
        new_node=Node(value)
        self.head=new_node
        self.tail=new_node
        self.length=1
        
    def print_list(self):
        temp = self.head
        while temp is not None:
            print(temp.value)
            temp = temp.next   
        
    def append(self, value):
        new_node = Node(value)
        if self.length == 0:
            self.head = new_node
            self.tail = new_node
        else:
            self.tail.next = new_node
            self.tail = new_node
        self.length += 1
        return True        
    
    def reverse_list(self):
        temp=self.head
        self.head=self.tail
        self.tail=temp
        after = temp.next
        before=None
        for _ in range(self.length):
            after=temp.next
            temp.next=before
            before=temp
            temp=after
            
    def add_one(self):
        carry=0
        prev=None
        self.head.value+=1
        while (self.head!=None) and (self.head.value>9 or carry>0):
            prev=self.head
            self.head.value+=carry
            carry=self.head.value//10
            self.head.value=self.head.value%10
            self.head=self.head.next


        if carry>0:
            prev.next=Node(carry)
        return prev.next
            
    
my_linked_list = LinkedList(1)
my_linked_list.append(9)
my_linked_list.append(9)
my_linked_list.append(9)
my_linked_list.print_list()
my_linked_list.reverse_list()
my_linked_list.print_list()
my_linked_list.add_one()
my_linked_list.print_list()

错误分析

  • 直接修改self.head导致链表结构丢失:add_one方法中直接移动self.head指针,循环结束后self.head指向None,后续调用print_list自然无法输出正确内容。必须使用临时指针遍历链表,保留原head的指向。
  • 初始加一逻辑重复且位置错误:代码先执行self.head.value +=1,随后循环里又给节点值加carry,导致第一次循环时节点值被重复累加。正确的做法是初始化carry=1,把加一操作融入到进位处理流程中。
  • 进位处理顺序错误:当前逻辑是先给节点值加carry,再计算新的carry和节点余数,这会导致计算逻辑混乱。正确顺序应为:先计算当前节点值与carry的总和,再用总和求新的carry和节点的最终值。
  • 未维护链表的tail和length属性:当加一产生新节点时,没有更新链表的tail指针和length值,会导致后续链表操作出现异常。

修正后的add_one方法

def add_one(self):
    carry = 1  # 初始进位为1,代表要加的1
    current = self.head
    prev = None
    
    while current is not None and carry > 0:
        total = current.value + carry
        carry = total // 10
        current.value = total % 10
        prev = current
        current = current.next
    
    # 如果还有进位,添加新节点到链表末尾
    if carry > 0:
        prev.next = Node(carry)
        self.tail = prev.next  # 更新tail指针
        self.length += 1

修正后的流程验证

执行修正后的代码,流程如下:

  1. 创建链表存储1999,打印输出1、9、9、9
  2. 反转链表后打印输出9、9、9、1
  3. 调用add_one后打印输出0、0、0、2
  4. 再次反转链表,打印输出2、0、0、0,完全符合预期结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:17:00