数组实现链表(C++代码+图解)
单链表
应用:实现邻接表(链式前向星),进而实现树和图的表示
定义变量和数组
int head, e[N], ne[N], idx;
注意:下面的i不是指第i个节点,而是下标为i的节点,即“指针”i指向的节点
head 表示第一个节点的下标 == first指针
e[i] 表示节点i的值 == 节点i的data
ne[i] 表示节点i的下一个节点的下标 == 节点i的next指针
idx 表示下一个新建节点的下标
eg: 单链表:3 5 7 9
初始化
void init() {
head = -1;
idx = 0;
}
插入
1.插入到第一个节点前
void intsert_to_head(int x) {
e[idx] = x;
ne[idx] = head; // 1.
head = idx; // 2.
idx++;
}
2.插入到k节点后
注意:这里的k不是指第k个节点,而是下标为k的节点,即“指针”k指向的节点
void insert_to_k(int k, int x) {
e[idx] = x;
ne[idx] = ne[k]; // 1.
ne[k] = idx; // 2.
idx++;
}
删除
删除k节点后的一个节点
注意:这里的k不是指第k个节点,而是下标为k的节点,即“指针”k指向的节点
直接更新k节点的next指针为第k+1个节点的next指针;
void remove(int k) {
ne[k] = ne[ne[k]];
}
双链表
eg: 双链表:3 5 7 9
定义变量和数组
int e[N], l[N], r[N], idx;
注意:下面的i不是指第i个节点,而是下标为i的节点,即“指针”i指向的节点
e[i] : 节点i的值 == 节点i的data
l[i]: 节点i的前一个节点的下标 == 节点i的左指针
r[i]: 节点i的下一个节点的下标 == 节点i的右指针
idx: 下一个新建节点的下标
初始化
采用技巧:设置节点0为起始节点,节点1为尾节点,下标从2开始,不设head指针
void init() {
r[0] = 1;
l[1] = 0;
idx = 2;
}
插入
在节点k右边插入值为x的节点
注意:这里的k不是指第k个节点,而是下标为k的节点,即“指针”k指向的节点
void insert(int k, int x) {
e[idx] = x;
r[idx] = r[k]; // 1.
l[idx] = k; // 2.
l[r[k]] = idx; // 3.
r[k] = idx; // 4,
idx++;
}
特殊点插入时:
-
插入到第一个节点前
// 相当于插入到头节点后 // 头节点下标为0 insert(0, x);
-
插入到最后一个节点后
// 相当于插入到尾节点的左节点右边 // 尾节点下标为1,所以尾节点的左节点下标为l[1] insert(l[1], x);
-
插入到k节点左边
// 相当于插入到k节点的左节点的右边 // k节点的左节点下标为l[k] insert(l[k], x);
删除
删除节点k
注意:这里的k不是指第k个节点,而是下标为k的节点,即“指针”k指向的节点
void remove(int k) {
r[l[k]] = r[k]; // 1.
l[r[k]] = l[k]; // 2.
}