一、双向链表
无关标记:实现代码文件夹k10,时间day9——2:40
1. 双向链表诞生场景: 单链表存在一个最大的问题是只能从前向后遍历。假设一个单链表的长度为1w,要查的索引在9999,则只能从第一个遍历到9999个。即单链表操作的核心在于如何找前驱。
2. 双向链表思想:每个节点既保存下一个节点的地址又保存上一个节点的地址。因此在双向链表的任意一个节点,既可以向后遍历,又可以向前遍历。
优点如下
3. 双向链表节点的定义
class Node{
//前驱节点的位置
private Node prev;
//元素值
private int val;
//后继节点的位置
private Node next;
}
4. 双向链表的定义(自己定义的双向链表)
(1)双向链表节点的定义
(2)size值(元素个数)
(3)链表头
(4)链表尾
(5)基本操作的覆写
5. 基本方法的覆写思路部分
(1)头插和尾插
A. 头插
B. 尾插
(2)在任意位置插入节点
A. 构造一个新节点,将值放入
B. 当需要插入的位置的索引为i的之后,需要找到索引为i的节点作为后继,索引为i - 1的节点作为前驱。利用node方法找到对应的所需要的节点
注意:为了找到索引为i的节点,这里抽象成为一个private方法仅供类内部其他方法使用(不止这个方法能用,删除,查找都能用到):node(int index)。其函数语义为返回索引为index的节点。
实现思路:当index > size / 2的时候,说明这个元素在右半边,倒着遍历;
当index < size / 2的时候,说明这个元素在左半边,正着遍历;
C. 采用分治法
先将索引为i - 1的节点(前驱)和新节点连线
再将索引为1的节点(后继)和新节点连线