前言
单链表是数据结构中最基础也最核心的线性表之一,熟练掌握其查找、指定位置插入与删除等操作,是深入学习算法与数据结构的关键一步。本文将从零实现单链表的常用接口,详细拆解每一步思路与代码细节,帮助大家真正理解指针操作与链表结构,夯实编程基础。
一、查找
思路
遍历:pcur 指向头结点,循环,当 pcur 不为空进入循环,pcur 里面指向的数据为要查找的值的时候就返回 pcur,否则将 pcur 下一个结点的地址赋值给 pcur 然后继续判断,直到找到值。如果为空直接返回。
代码
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 位置的前一个结点让它的 next 指针指向 newnode,然后让 newnode 的 next 指针指向 pos。如何找到 pos 的前一个结点?那就是遍历,从头结点开始,向后遍历,直到 prev 的 next 指针指向 pos 则就是 pos 的前一个结点。这里要注意,当 pos 为头结点的时候,执行的操作就变为了头插。
代码
// 在指定位置之前插入
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x) {
assert(pphead && pos);
// 只有一个节点
if (pos == *pphead)
SLTPushFront(pphead, x);
{
SLTNode* newnode = SLTBuyNode(x);
SLTNode* prev = *pphead;
(prev->next != pos)
prev = prev->next;
newnode->next = pos;
prev->next = newnode;
}
}


