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
修正后的流程验证
执行修正后的代码,流程如下:
- 创建链表存储1999,打印输出1、9、9、9
- 反转链表后打印输出9、9、9、1
- 调用
add_one后打印输出0、0、0、2 - 再次反转链表,打印输出2、0、0、0,完全符合预期结果
内容的提问来源于stack exchange,提问作者Trishna
相关产品推荐
相关产品推荐

