单向链表按序查找是通过遍历计数定位第i个节点,不依赖值匹配;带头结点时从头结点出发移动i次指针,不带头结点时从首节点起计数,需处理空链表、序号越界等边界情况,时间复杂度o(n),空间复杂度o(1)。
单向链表的按序查找,就是根据节点在链表中的位置(从头开始数第几个)来定位目标节点。它不依赖值匹配,而是靠遍历计数实现,适用于已知索引但无法随机访问的场景。
理解“序号”的起始点
多数教材和工程实现中,头结点不计入数据序号,第一个实际存储数据的节点为第1个节点。也有部分实现把头结点当作第0个节点——关键看你的链表是否带头结点:
- 带头结点:查找第i个数据节点时,从头结点出发,移动i次指针(即跳过i个链接),最终停在第i个数据节点上
- 不带头结点:查找第i个节点,需从首节点开始计数,第1次比较即对应第1个节点,循环条件通常为 j
- 若传入序号为0且链表带头结点,可直接返回头结点;若序号小于1,应统一返回NULL或报错
核心查找逻辑与代码要点
本质是用一个指针从起点出发,配合计数器逐个推进,直到计数达到目标序号或链表结束:
- 初始化指针 p = head(带头结点)或 p = head->next(不带头结点)
- 初始化计数器 j = 0(带头结点)或 j = 1(不带头结点)
- 循环条件为 p != NULL && j ,每次迭代执行 p = p->next; j++
- 退出循环后,检查 j == i 再返回 p,否则说明序号越界,返回NULL
常见边界情况处理
忽略这些细节容易导致段错误或逻辑错误:
- 空链表:head为NULL,直接返回NULL
- 序号为0:若链表带头结点,可合法返回头结点;否则应拒绝并返回错误码
- 序号超出长度:循环结束后 p == NULL,此时不能解引用,必须判空后返回NULL
- 序号为负数:应在进入循环前拦截,避免无意义遍历
时间与空间开销特点
按序查找不具备随机访问能力,必须顺序推进:
- 时间复杂度恒为 O(n),最坏情况要遍历到末尾
- 平均查找长度约为 n/2,与序号分布有关
- 空间复杂度为 O(1),仅使用常量级额外变量
- 不适合高频、多点随机索引访问——此时应考虑改用顺序表或带索引结构











