1. 链表基础与核心操作解析
链表作为计算机科学中最基础的数据结构之一,与数组相比具有动态内存分配的优势。在实际开发中,链表广泛应用于内存管理、文件系统、哈希表冲突处理等场景。理解链表的本质和操作技巧,是每位程序员必须掌握的硬核技能。
1.1 链表结构深度剖析
链表由一系列节点(Node)组成,每个节点包含两个核心部分:
- 数据域(val):存储当前节点的实际数据
- 指针域(next/prev):存储相邻节点的内存地址
单向链表的结构特点:
java复制class ListNode {
int val; // 数据域
ListNode next; // 指向下一个节点
ListNode(int x) { val = x; }
}
双向链表的增强特性:
java复制class DoublyListNode {
int val;
DoublyListNode prev; // 指向前驱节点
DoublyListNode next; // 指向后继节点
DoublyListNode(int x) { val = x; }
}
关键理解:链表通过指针实现物理非连续但逻辑连续的内存存储,这正是其能够动态扩容的核心机制。
1.2 链表操作的时空复杂度
| 操作 | 时间复杂度 | 空间复杂度 | 说明 |
|---|---|---|---|
| 访问元素 | O(n) | O(1) | 必须从头节点开始遍历 |
| 插入/删除 | O(1) | O(1) | 修改指针即可完成 |
| 查找元素 | O(n) | O(1) | 需要遍历整个链表 |
| 反转链表 | O(n) | O(1) | 需要遍历并修改每个指针 |
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 链表核心算法实战
2.1 移除链表元素(LeetCode 203)
删除链表中所有指定值的节点,需要考虑三种边界情况:
- 头节点就是要删除的节点
- 链表为空
- 连续多个节点都需要删除
优化后的Java实现:
java复制public ListNode removeElements(ListNode head, int val) {
// 处理头节点连续等于val的情况
while (head != null && head.val == val) {
head = head.next;
}
if (head == null) return null;
