前言
单链表是数据结构中最基础也最核心的线性表之一。熟练掌握其查找、指定位置插入与删除等操作,是深入学习算法与数据结构的关键一步。本文将从零实现单链表的常用接口,详细拆解每一步思路与代码细节,帮助大家真正理解指针操作与链表结构。
一、查找
实现思路:
遍历链表,pcur 指向头结点(或当前节点)。循环判断 pcur 是否为空,若不为空则检查数据域是否匹配目标值。若匹配直接返回该节点;否则将 pcur 移动到下一个节点继续判断。若遍历结束仍未找到,返回 NULL。
代码实现:
SLTNode* SLTFind(SLTNode* phead, SLTDataType x) {
SLTNode* pcur = phead;
while (pcur) {
if (pcur->data == x)
return pcur;
pcur = pcur->next;
}
return NULL;
}
测试示例:
void test1() {
SLTNode* head = NULL;
SLTPushFront(&head, 1);
SLTPushFront(&head, 2);
SLTPushFront(&head, 3);
SLTNode* find = SLTFind(head, 1);
if (find)
printf("找到了!\n");
else
printf("未找到\n");
}
时间复杂度: O(n)
二、指定位置之前或之后插入元素
2.1 在指定位置之前插入
实现思路:
首先需确保头文件非空且 pos 有效。要找到 pos 的前一个节点 prev,使 prev->next 指向新节点,新节点的 next 指向 pos。
若 pos 为头结点,则退化为头插操作。寻找 prev 时从头开始遍历,直到 prev->next == pos。
代码实现:
// 在指定位置之前插入
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x) {
assert(pphead && pos);
(pos == *pphead)
SLTPushFront(pphead, x);
{
SLTNode* newnode = SLTBuyNode(x);
SLTNode* prev = *pphead;
(prev->next != pos)
prev = prev->next;
newnode->next = pos;
prev->next = newnode;
}
}


