单链表是一种常见的链式存储结构,其结点由两部分组成:数据域和指针域。
- 数据域用于存储实际的数据元素(如示例中的整型
int data); - 指针域则存储下一个结点的地址(即指向后继结点的指针
struct node *next),从而通过指针建立起数据元素之间的逻辑关系。
在C语言中,单链表结点可通过结构体定义如下:
typedef struct node {
int data; // 数据域
struct node *next; // 指针域,指向下一个结点
} NODE, *LinkList;
其中,NODE 表示结点类型,LinkList 是指向结点的指针类型,常用于表示链表的头指针。
单链表的主要特点包括:
- 物理地址不连续:各个结点在内存中的位置可以是分散的,依靠指针链接形成逻辑上的连续性;
- 动态内存分配:结点空间在运行时按需申请(如使用
malloc),无需像顺序表那样预先分配固定大小的空间; - 通过头指针访问整个链表:只要保留头指针
Head,就可以遍历整个链表。
插入操作(在结点 p 后插入 s)
实现步骤如下(注意顺序不能颠倒):
s->next = p->next;// 将 s 的指针域指向 p 的后继结点p->next = s;// 更新 p 的指针域,使其指向 s
这样就完成了将 s 结点插入到 p 结点之后的操作,时间复杂度为 O(1),体现了链表在插入操作上的高效性。
相比顺序表,单链表的优势在于:
- 插入和删除操作只需修改指针,无需移动大量元素;
- 更适合频繁增删元素的应用场景,例如实现动态集合、队列或栈等。
在单链表中查找某个特定值的结点,需要从头指针开始,依次遍历每个结点,比较其数据域是否等于目标值,直到找到该结点或遍历完整个链表。
查找步骤:
- 从头结点开始(通常用一个工作指针
p指向头结点); - 判断当前结点是否为空(即是否已到达链表末尾);
- 若不为空,比较
p->data是否等于目标值;- 如果相等,返回该结点或其位置;
- 否则,将指针移动到下一个结点
p = p->next;
- 重复步骤 2~3,直到找到目标或遍历结束。
C语言实现代码:
LinkList SearchNode(LinkList head, int target) {
LinkList p = head; // 工作指针从头结点开始
while (p != NULL) {
if (p->data == target) {
return p; // 找到目标结点,返回其地址
}
p = p->next; // 移动到下一个结点
}
return NULL; // 未找到,返回NULL
}
说明:
- 时间复杂度:O(n),最坏情况下需要遍历整个链表;
- 空间复杂度:O(1),仅使用一个辅助指针;
- 单链表不支持随机访问,因此只能采用顺序查找方式。



被折叠的 条评论
为什么被折叠?



