单链表是一种常见的链式存储结构,其结点由两部分组成:**数据域**和**指针域**

单链表是一种常见的链式存储结构,其结点由两部分组成:数据域指针域

  • 数据域用于存储实际的数据元素(如示例中的整型 int data);
  • 指针域则存储下一个结点的地址(即指向后继结点的指针 struct node *next),从而通过指针建立起数据元素之间的逻辑关系。

在C语言中,单链表结点可通过结构体定义如下:

typedef struct node {
    int data;              // 数据域
    struct node *next;     // 指针域,指向下一个结点
} NODE, *LinkList;

其中,NODE 表示结点类型,LinkList 是指向结点的指针类型,常用于表示链表的头指针。

单链表的主要特点包括:

  1. 物理地址不连续:各个结点在内存中的位置可以是分散的,依靠指针链接形成逻辑上的连续性;
  2. 动态内存分配:结点空间在运行时按需申请(如使用 malloc),无需像顺序表那样预先分配固定大小的空间;
  3. 通过头指针访问整个链表:只要保留头指针 Head,就可以遍历整个链表。

插入操作(在结点 p 后插入 s)

实现步骤如下(注意顺序不能颠倒):

  1. s->next = p->next; // 将 s 的指针域指向 p 的后继结点
  2. p->next = s; // 更新 p 的指针域,使其指向 s

这样就完成了将 s 结点插入到 p 结点之后的操作,时间复杂度为 O(1),体现了链表在插入操作上的高效性。

相比顺序表,单链表的优势在于:

  • 插入和删除操作只需修改指针,无需移动大量元素
  • 更适合频繁增删元素的应用场景,例如实现动态集合、队列或栈等。

在单链表中查找某个特定值的结点,需要从头指针开始,依次遍历每个结点,比较其数据域是否等于目标值,直到找到该结点或遍历完整个链表。

查找步骤:

  1. 从头结点开始(通常用一个工作指针 p 指向头结点);
  2. 判断当前结点是否为空(即是否已到达链表末尾);
  3. 若不为空,比较 p->data 是否等于目标值;
    • 如果相等,返回该结点或其位置;
    • 否则,将指针移动到下一个结点 p = p->next
  4. 重复步骤 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),仅使用一个辅助指针;
  • 单链表不支持随机访问,因此只能采用顺序查找方式。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值