声明:本文主要作为作者的复习笔记,由于作者水平有限,难免有错误和不准确之处,欢迎读者批评指正。
数组这种结构适用于频繁查询,低频插入和修改的场景;若频繁插入和删除时,由于需要进行元素的搬移以及扩容等操作,浪费空间,性能开销较大,因此引入链表;
在链表中存储元素,最终放在节点类,链表是由一系列的节点组成的,最终用户只需要和链表类打交道即可,至于元素到底在哪存储,怎么存储,用户不关心,Node类对用户完全隐藏;
此时链表只能从第一个节点开始向后遍历,无法从后向前;单链表操作的核心就是在找前驱。
单向链表Node类的定义
private static class Node {
//当前节点保存的元素
private int val;
//后继节点的位置
private Node next;
}
第一个节点保存具体元素,是不带头的链表;
单向不带头链表有两个比较特殊的节点
头节点:只有头节点没有前驱;
尾节点:只有尾节点没有后继;
带头链表的第一个节点没有具体的元素值,只是作为链表的头节点去使用;
每个节点既保存下一个节点的地址,也保存前一个节点的地址;因此我们在双向链表的任意一个节点,就可以既向后遍历,也可以向前遍历。
假设要检索一个索引为index的节点,根据index和中间节点mid的关系;
双向链表Node类的定义
private static class Node {
//前驱节点的位置
private Node prev;
//当前节点保存的元素
private int val;
//后继节点的位置
private Node next;
}