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

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属性初始为None
  • self.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号节点。


遍历方法的代码如下:

def print_list(self):
    temp = self.head 
    while temp is not None:
        print(temp.value)
        temp = temp.next

逐行对应执行状态:

  1. temp = self.head:定义临时遍历指针temp,初始指向head对应的首节点,也就是1号节点
  2. 第一次while判断:temp is not None成立(temp指向1号节点),进入循环体
    • 执行print(temp.value):打印1号节点的值,输出1
    • 执行temp = temp.next:1号节点的next属性在之前append(5)时已经存了5号节点的地址,因此这行执行完,temp指针不再指向1号节点,改为指向5号节点
  3. 第二次while判断:temp is not None成立(temp指向5号节点),进入循环体
    • 执行print(temp.value):打印5号节点的值,输出5
    • 执行temp = temp.next:5号节点的next属性在append(6)时已经存了6号节点的地址,因此这行执行完,temp指针改为指向6号节点
  4. 第三次while判断:temp is not None成立(temp指向6号节点),进入循环体
    • 执行print(temp.value):打印6号节点的值,输出6
    • 执行temp = temp.next:6号节点是尾节点,它的next从来没被修改过,还是初始值None,因此这行执行完,temp变为None
  5. 第四次while判断:temp is not None不成立,直接退出循环,遍历结束。

遍历的本质非常简单:临时指针从链表头出发,每处理完一个节点,就顺着当前节点提前存好的next指针跳到下一个节点,直到跳到链尾的None位置就停止,不存在什么“自动找下一个节点”的逻辑,所有指向关系都是建链阶段就提前设置好的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:24:21