链表的原理
元素(element): 真实存于线性表中的内容,是我们关心的核心内容。
结点(node): 为了组织链表而引入的一个结构,除了保存我们的元素之外,还会保存指向下一个结点的引用。
- 创建结点
class Node
{
int val; // 保存我们的元素
Node next; // 保存指向下一个结点的引用;其中尾节点的 next == null
}
// head 是一条链表的头结点;通过 head 我们可以找到所有的结点;所以用头节点完全代表链表
Node head = ...;
// 某条链表的头结点是 null,表示头结点不存在。进一步可以表示是一条没有头结点的链
//表,也就是一条空链表
Node head = null;
- 当前结点(current / cur): 表示链表中某个结点。
前驱结点(previous / prev): 表示链表中某个结点的前一个结点;头结点没有前驱结点。
后继结点(next): 表示链表中某个结点的后一个结点;尾结点没有后继结点。
链表的遍历
Node cur = head;
while (cur != null) {
cur = cur.next;
}
链表的插入与删除
- 给定前驱结点后的插入
Node prev = ...;
Node node = new Node(v);
node.next = prev.next;
prev.next = node;
- 给定前驱结点后的删除
Node prev = ...; // 待删除元素的前驱结点
prev.next = prev.next.next;
- 头插
public static void main(String args) {
Node head = build();
head = pushFront(head, 0);
// 通过遍历打印,验证头插是否正确
}
private static Node pushFront(Node head, int v) {
Node node = new Node(v);
node.next = head;
head = node;
return head;
}