用数组模拟单链表(链式前向心)
一般用结构体创建链表运行会比较慢,所以需要一种更快的方法来满足算法竞赛中速度快的要求。
- 首先,用e[N]数组来存节点的值,ne[N]数组来存当前节点的下一个节点的地址(也可以说是下标)。这两个数组是相互关联的,它们之间通过下标相互关联的。
- 这里用-1表示空集,head的值表示头节点的下标,这个方法就是用头插法创建链表的。
- 该方法会造成数组空间的浪费,不过在算法竞赛中以浪费一点空间来换取时间是可取的。
准备工作:
const int N = 100010; int head, e[N], ne[N], idx; void Init() { head = -1; idx = 0; }
将x插到头节点:
void add_to_head { e[idx] = x; ne[idx] = head; head = idx++; }
将x插到下标为k的点的后面:
void add(int k, int x) { e[idx] = x; ne[idx] = ne[k]; ne[k] = idx++: }
将下标为k的后面的一个点删除:
void remove(int k) { ne[k] = ne[ne[k]]; }