一、链表基础概念
链表是一种动态存储数据的结构,核心是'用指针把离散的节点串起来',像一串糖葫芦:
- 节点:每个糖葫芦(存储一个数据),包含两部分:
- 数据域:存储实际要保存的数据(比如数字、结构体、指针);
- 指针域:存储下一个(或上一个)节点的地址,相当于糖葫芦的竹签,把节点连起来。
- 链表:所有节点通过指针域串联形成的整体,不需要连续的内存空间(和数组最大的区别)。
对比数组,你就能秒懂链表的核心优势:
| 特性 | 数组(比如 int arr[10]) | 链表 |
|---|---|---|
| 内存分配 | 连续内存块 | 离散内存块(按需分配) |
| 插入 / 删除 | 需移动大量元素(效率低) | 只需改指针(效率高) |
| 容量扩展 | 固定大小(无法动态扩展) | 可动态添加节点(无上限) |
| 访问方式 | 下标直接访问(arr[3]) | 必须从头遍历(顺序访问) |
二、单向链表与双向链表
FreeRTOS 中用的是双向链表(方便正反遍历、插入删除),但先从单向链表入门,再过渡到双向链表更易理解。
1. 单向链表(入门必备)
- 结构:每个节点只有一个指针,指向下一个节点,最后一个节点的指针为
NULL(表示链表结束)。 - 核心:只能从'头节点'往后遍历,不能反向查找。
(1)单向链表节点定义(C 语言代码)
// 定义节点结构体:数据域 + 指针域
struct Node {
int data; // 数据域:存储整数(可替换为任意类型,比如结构体)
struct Node *next; // 指针域:指向同类型的下一个节点
};
// 为了书写方便,重定义类型名(类似 FreeRTOS 的 typedef)
typedef struct Node ListNode;
(2)单向链表的核心操作(3 个最常用)
① 创建节点(申请内存 + 赋值)
// 创建一个新节点,返回节点指针
ListNode* createNode {
ListNode *newNode = (ListNode*)((ListNode));
newNode->data = data;
newNode->next = ;
newNode;
}

