Python中print_list()遍历链表原理 temp=temp.next逻辑解析
Python链表遍历逻辑逐行解析
首先说明:原代码中self.lenth =+ 1为书写笔误,正确写法应为self.lenth += 1,但打印逻辑不依赖长度属性,因此不影响最终输出1、5、6的结果。
核心基础概念
- Python中所有变量本质都是对象引用(即你理解的指针),存储的是实际对象在内存中的地址,不会拷贝整个对象
- 每个
Node节点对象包含两个属性:value存储节点的数值,next存储下一个节点的内存地址,初始值为None代表没有后续节点 - 链表本身不需要连续内存存储所有节点,仅靠
head(指向第一个节点)、tail(指向最后一个节点)两个指针,加上每个节点自带的next指针,就能把分散在内存中的节点串成完整的链。
建链过程逐行拆解(这是next指针能正确指向后续节点的前提)
你疑惑的temp.next为什么能拿到值为5的节点,本质是在追加节点的阶段,我们就已经手动把每个节点的next指针绑定好了下一个节点的地址,和遍历阶段的temp指针无关。
1. 初始化链表:my_linked_list = LinkedList(1)
对应LinkedList类的初始化逻辑:
new_node = Node(value):创建一个值为1的节点,它的next属性初始为Noneself.head = new_node:让链表的head指针指向这个值为1的首节点self.tail = new_node:此时链表只有1个节点,tail指针也指向这个值为1的节点self.lenth = 1:记录链表长度为1
此时状态:值为1的节点next为None,head、tail同时指向它。
2. 追加第一个节点:my_linked_list.append(5)
对应append方法逻辑:
new_node = Node(value):创建一个值为5的新节点,它的next属性初始为None- 判断
self.head is None:当前head指向值为1的节点,不为空,走else分支 self.tail.next = new_node:最核心的连链操作:此时tail指向值为1的节点,我们把这个节点的next属性从原来的None,修改为刚创建的值为5的节点的内存地址,相当于给1号节点接好了下一跳self.tail = new_node:tail指针往后移动,指向新的尾节点(值为5的节点)
此时状态:1号节点.next → 5号节点;5号节点.next → None;head指向1号节点,tail指向5号节点。
3. 追加第二个节点:my_linked_list.append(6)
逻辑和追加5完全一致:
- 创建值为6、next为None的新节点
- head不为空走else分支
- 此时tail指向5号节点,把5号节点的
next属性修改为6号节点的地址,给5号节点接好下一跳 - 移动tail指针到6号节点
建链完成后的完整链路:head → 1号节点 → 5号节点 → 6号节点 → None,tail指向6号节点。
print_list()遍历逻辑逐轮拆解
遍历方法的代码如下:
def print_list(self): temp = self.head while temp is not None: print(temp.value) temp = temp.next
逐行对应执行状态:
temp = self.head:定义临时遍历指针temp,初始指向head对应的首节点,也就是1号节点- 第一次while判断:
temp is not None成立(temp指向1号节点),进入循环体- 执行
print(temp.value):打印1号节点的值,输出1 - 执行
temp = temp.next:1号节点的next属性在之前append(5)时已经存了5号节点的地址,因此这行执行完,temp指针不再指向1号节点,改为指向5号节点
- 执行
- 第二次while判断:
temp is not None成立(temp指向5号节点),进入循环体- 执行
print(temp.value):打印5号节点的值,输出5 - 执行
temp = temp.next:5号节点的next属性在append(6)时已经存了6号节点的地址,因此这行执行完,temp指针改为指向6号节点
- 执行
- 第三次while判断:
temp is not None成立(temp指向6号节点),进入循环体- 执行
print(temp.value):打印6号节点的值,输出6 - 执行
temp = temp.next:6号节点是尾节点,它的next从来没被修改过,还是初始值None,因此这行执行完,temp变为None
- 执行
- 第四次while判断:
temp is not None不成立,直接退出循环,遍历结束。
遍历的本质非常简单:临时指针从链表头出发,每处理完一个节点,就顺着当前节点提前存好的next指针跳到下一个节点,直到跳到链尾的None位置就停止,不存在什么“自动找下一个节点”的逻辑,所有指向关系都是建链阶段就提前设置好的。
内容的提问来源于stack exchange,提问作者Tychius
相关产品推荐
相关产品推荐

