单链表核心操作全实现
单链表是数据结构中最基础也最核心的线性表之一。熟练掌握其查找、指定位置插入与删除等操作,是深入学习算法与数据结构的关键一步。本文将从零实现单链表的常用接口,详细拆解每一步思路与代码细节,帮助大家真正理解指针操作与链表结构。
一、查找操作
思路:
遍历链表,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)
二、指定位置前后插入元素
在指定位置之前插入
思路:
要在 pos 之前插入新节点,必须先找到 pos 的前驱节点 prev。让 prev->next 指向新节点,新节点的 next 指向 pos。
这里有个特殊情况:如果 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;
}
}


