链表追加节点:current与current.next的写法差异及原因探究
链表add方法两种写法的差异解析
背景代码
Node类定义
class Node: def __init__(self, data): self.data = data self.next = None
add方法第一部分
def add(self, newData): if self.head is None: self.head = Node(newData) return current = self.head
问题
为什么以下有效写法能正确给链表追加节点?
while current.next: current = current.next current.next = Node(newData)
而以下无效写法无法完成追加?
while current: current = current.next current = Node(newData)
两者的判断条件current.next和current看起来类似,为什么结果完全不同?
核心原因:操作对象的本质不同
有效写法的逻辑
这个写法的核心是找到链表的最后一个节点,然后修改它的next属性:
- 循环条件
current.next会在当前节点的下一个节点为空时停止,此时current指向的是链表的最后一个有效节点(它的next是None) - 给
current.next赋值新的Node实例,相当于直接把新节点挂载到了原链表的末尾,链表的结构被正确更新
无效写法的问题
这个写法的问题在于最后操作的是一个和原链表无关的局部变量:
- 循环条件
current会一直执行,直到current本身变成None(也就是遍历完最后一个节点的next之后) - 此时给
current赋值新节点,只是改变了局部变量current的指向,原链表的最后一个节点的next依然是None,新节点根本没被关联到链表上
简单总结:
- 第一种写法是在修改链表节点的属性,让链表的结构延伸
- 第二种写法是在给一个已经脱离链表的局部变量重新赋值,完全没影响原链表的结构
内容的提问来源于stack exchange,提问作者LosProgramer
相关产品推荐
相关产品推荐

