单向链表按序查找与插入的关键在于一次遍历完成定位与操作;按位置序号需计数器遍历至i−1,按逻辑顺序则边比较边遍历至满足条件处。

单向链表的按序查找与插入,关键不在写多少代码,而在于用好流程控制逻辑——用一次遍历同时完成定位和操作,避免重复走链表。
明确“序”的类型再设计流程
“按序”有两种常见理解,流程控制方式完全不同:
- 按位置序号查/插:比如找第3个节点、在第2个位置后插入。流程就是“计数器+遍历”,从头开始数到i−1,停住,执行操作。
- 按逻辑顺序查/插:比如升序链表中找第一个≥5的位置并插入5。流程是“边走边比”,遇到data ≥ target就停,此时前驱即为插入点。
按位置序号查找与插入的流程控制
适用于已知索引(如第i个)的场景,核心是用一个整型变量记录当前序号:
- 初始化计数器count = 0,指针p = head(带头结点时,有效数据从head→next开始)
- 循环条件:p != NULL && count
- 循环结束时,若p非空且count == i−1,说明p指向第i−1个节点,可安全在其后插入
- 若p为空或count
按逻辑顺序(如升序)查找与插入的流程控制
适用于维持链表有序性的插入,典型流程是一次双指针推进:
- 设prev = head,curr = head→next(带头结点前提下)
- 循环条件:curr != NULL && curr→data
- 循环体内:prev = curr;curr = curr→next
- 退出循环后,prev即为插入前驱,curr指向首个≥target的节点(或为NULL)
- 执行插入:newNode→next = curr;prev→next = newNode
避免常见流程陷阱
很多实现效率低,不是因为算法错,而是流程设计绕弯:
- 不要先调用一次查找函数获取前驱,再调用一次插入函数——等于遍历两次
- 不要在插入前单独判断是否为空链表,而应在主流程中用prev和curr初始状态自然覆盖(例如prev=head, curr=head→next,空链表时curr为NULL,直接插到head后)
- 所有指针移动必须配NULL检查,尤其是curr→next或curr→data访问前











