链表作为基本的线性表结构,在 Java 集合里对应 LinkedList。虽然实际开发中很少自己写链表,但明白它的工作原理会让你在选用集合时更有把握。
LinkedList 实现了 List 和 Deque 接口,底层是双向链表。这意味着它没有容量限制,在两端或节点附近做增删很快,但随机访问很慢——每次 get(index) 都要从头部或尾部遍历过去。
链表结构
每个节点(Node)包含数据域和前后指针。单链表只有一个方向,双向链表前后都能走。LinkedList 用的就是双向链表,可以从前或从后遍历。
图:单向链表结构示意图
手动实现单链表
我习惯先写一个简单的单链表,这样能切身体会那些操作的复杂度。下面是一个无头结点的单链表,实现一些基本操作。
节点定义与初始化
static class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
public class MyLinkedList {
private ListNode head;
// 构造一个示例链表:1 -> 2 -> 3 -> 4 -> 5
public ListNode createList() {
ListNode node0 = new ListNode(1);
ListNode node1 = new ListNode(2);
ListNode node2 = new ListNode(3);
ListNode node3 = new ListNode(4);
();
node0.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
head = node0;
head;
}


