主要细节
- 在数组中用0表示头指针,1表示尾部指针(双链表) ,使用
len下一个插入的节点下标。 - 定义
val表示节点取值,nxt或l和r表示链表指向。 - -1表示空节点
单链表
- nxt数组必须初始化为全-1
- 使用0表示头指针,新节点的下标从1开始。
- add指的是在k结点之后插入新节点 ,remove指的是移除第k个节点下一个节点(单链表不支持删除当前节点)。
- 节点k并非第k个位置的节点,而是添加时的顺序,
cpp
int m, val[100009], nxt[100009] = {-1}, len;
void init() {
nxt[0] = -1;
len = 1;
}
void add(int k, int x) {
val[len] = x;
nxt[len] = nxt[k];
nxt[k] = len;
len++;
}
void remove(int k) {//remove next item
nxt[k] = nxt[nxt[k]];
}
void printout() {
int cur = nxt[0];
while (cur != -1) {
cout << val[cur] << " ";
cur = nxt[cur];
}
}
例题
双链表
- l和r数组必须初始化为全-1
- 使用0表示头指针,1表示尾指针,新节点的下标从2开始。
- add指的是在k结点之后插入新节点 ,remove指的是移除第k个节点(双链表支持删除当前节点)。
- 节点k并非第k个位置的节点,而是添加时的顺序。例如,删除第k个节点指的是下标为k+1个节点。
cpp
int m, l[100009] = {-1}, r[100009] = { -1 }, val[100009],len;
void init() {
l[1] = 0;
r[0] = 1;
len = 2;
}
void add(int k, int x) {
val[len] = x;
l[len] = k;
r[len] = r[k];
l[r[k]] = len;
r[k] = len;
len++;
}
void remove(int k) {
r[l[k]] = r[k];
l[r[k]] = l[k];
}
void printout() {
int cur = r[0];
while (cur != 1) {
cout << val[cur] << " ";
cur = r[cur];
}
}