目标:掌握单链表的数据结构
单链表
单链表常用于存储树和图
我们这里用用数组模拟单链表 用数组效率高,而且让我们更加的理解单链表的数据结构
理解了我画的图,你就知道了单链表需要存储两个信息
- 值
- 下一个的索引
单链表的操作
ok,基础的操作就这三个、其余的操作也基本可以通过这三个得到
题目
AcWing826 单链表
实现一个单链表,链表初始为空,支持三种操作:
(1) 向链表头插入一个数;
(2) 删除第k个插入的数后面的数;
(3) 在第k个插入的数后插入一个数
现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。
注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。
题解
这个题目还有一点小坑,比如时间是第k个插入的点的下标是?
第一个点 idx=0
第k个点 idx=k-1 下标是k-1
模板
//=====单链表的定义=====
private static int head;
private static int[] e = new int[N];
private static int[] ne = new int[N];
private static int idx;
//=====单链表的操作=====
//1. 初始化单链表
private static void init(){
head = -1;
idx = 0;
}
//2. 向单链表的头部插入一个数
private static void addToHead(int val){
e[idx] = val;
ne[idx] = head; //插入到头
head = idx; //头部节点跟新
idx++;
}
//3. 向单链表的下标位k个后加一个数val
private static void add(int k, int val){
e[idx] = val;
ne[idx] = ne[k];
ne[k] = idx;
idx++;
}
//4. 删除下标位k后面的那个节点
private static void remove(int k){
ne[k] = ne[ne[k]];
}