1. 链表基础概念与核心特性
链表作为数据结构领域的经典之作,本质上是由一系列节点(Node)组成的线性集合。与数组这种"连续内存块"的存储方式截然不同,链表的每个节点都像火车站里连接的车厢——彼此通过指针链接,但物理存储位置可以分散在内存的各个角落。这种离散式存储结构带来了独特的优势与局限。
1.1 物理存储与逻辑结构
在物理层面,链表的节点通常包含两个部分:数据域(存储实际数据)和指针域(存储下一个节点的地址)。以C语言为例,一个典型的节点定义如下:
c复制struct Node {
int data; // 数据域
struct Node* next; // 指针域
};
这种结构导致链表在内存中的实际分布可能呈现"跳跃式"特征。假设有三个节点A、B、C,它们的物理地址可能是:
- A: 0x1000
- B: 0x3040
- C: 0x2008
尽管地址不连续,但通过每个节点的next指针,依然能保持A→B→C的逻辑顺序。这种特性使得链表在内存利用率上非常灵活——只要存在足够的内存碎片,就可以创建新节点。
1.2 时间复杂度特征
链表的操作时间复杂度呈现出明显的两极分化:
- 插入/删除:在已知位置操作时达到O(1)效率。例如在节点A后插入新节点X,只需修改A的next指向X,X的next指向B即可,无需像数组那样移动后续所有元素。
- 随机访问:必须从头节点开始逐个遍历,最坏情况下需要O(n)时间。比如要访问第100个节点,必须走过前面99个节点。
这种特性使得链表特别适合频繁增删但较少随机访问的场景。想象一个银行排队系统,新客户随时加入(插入)、已办理客户离开(删除),但很少需要直接查询队列中第N个人的信息。
关键认知误区:许多人认为链表"省内存"。实际上,由于每个节点都需要额外空间存储指针,存储相同数据量时,链表的内存开销通常比数组大20%-50%(取决于指针和数据类型的相对大小)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 单链表深度解析
单链表是最简洁的链表形态,其核心特征是节点只包含一个指向后继的指针,形成单向链路。这种简约设计带来了一系列特有的行为模式。
2.1 结构实现细节
完整的单链表通常由两个结构体协作完成:
c复制type
