Skip to content

链表

单链表

数组模拟单链表:

C++
// vals存储节点的值 nexts存储指向下一个节点的指针
int vals[N], nexts[N];
// head表示指向表头的指针(vals[head]就会取到表头的值)
// idx指向当前可用的节点(链表尾的空节点)
int head, idx;

// 初始化 头节点指针为-1表示没有头节点 idx=1表示当前可用的节点是第1个节点
void init() {
    head = -1;
    idx = 0;
}

// 向链表头部插入一个值为x的节点
void insert_to_head(int x) {
    vals[idx] = x;
    nexts[idx] = head;
    head = idx++;
}

// 在第k个节点*之后*插入一个值为x的节点
void insert(int k, int x) {
    vals[idx] = x;
    nexts[idx] = nexts[k];
    nexts[k] = idx++;
}

// 删除第k个节点*之后*的一个节点
void remove(int k) {
    nexts[k] = nexts[nexts[k]];
}
// vals存储节点的值 nexts存储指向下一个节点的指针
int vals[N], nexts[N];
// head表示指向表头的指针(vals[head]就会取到表头的值)
// idx指向当前可用的节点(链表尾的空节点)
int head, idx;

// 初始化 头节点指针为-1表示没有头节点 idx=1表示当前可用的节点是第1个节点
void init() {
    head = -1;
    idx = 0;
}

// 向链表头部插入一个值为x的节点
void insert_to_head(int x) {
    vals[idx] = x;
    nexts[idx] = head;
    head = idx++;
}

// 在第k个节点*之后*插入一个值为x的节点
void insert(int k, int x) {
    vals[idx] = x;
    nexts[idx] = nexts[k];
    nexts[k] = idx++;
}

// 删除第k个节点*之后*的一个节点
void remove(int k) {
    nexts[k] = nexts[nexts[k]];
}

双链表

数组模拟双链表:

C++
// vals存储节点的值 nexts存储指向下一个节点的指针 prevs存储上一个节点的指针
int vals[N], prevs[N], nexts[N];
int idx; // idx指向当前可用的节点(链表尾的空节点)

// 初始化 在双链表中默认第0个节点为头节点 第1个节点为尾节点
// 此时头节点下一个节点是尾节点 尾节点上一个节点是头节点 idx=2表示当前可用的节点是第2个节点
void init() {
    nexts[0] = 1;
    prevs[1] = 0;
    idx = 2;
}

// 在第k个节点*之后*插入一个值为x的节点
void insert(int k, int x) {
    vals[idx] = x;
    prevs[idx] = k;
    nexts[idx] = nexts[k];
    prevs[nexts[idx]] = idx;
    nexts[k] = idx++;
}

// 删除第k个节点
void remove(int k) {
    prevs[nexts[k]] = prevs[k];
    nexts[prevs[k]] = nexts[k];
}
// vals存储节点的值 nexts存储指向下一个节点的指针 prevs存储上一个节点的指针
int vals[N], prevs[N], nexts[N];
int idx; // idx指向当前可用的节点(链表尾的空节点)

// 初始化 在双链表中默认第0个节点为头节点 第1个节点为尾节点
// 此时头节点下一个节点是尾节点 尾节点上一个节点是头节点 idx=2表示当前可用的节点是第2个节点
void init() {
    nexts[0] = 1;
    prevs[1] = 0;
    idx = 2;
}

// 在第k个节点*之后*插入一个值为x的节点
void insert(int k, int x) {
    vals[idx] = x;
    prevs[idx] = k;
    nexts[idx] = nexts[k];
    prevs[nexts[idx]] = idx;
    nexts[k] = idx++;
}

// 删除第k个节点
void remove(int k) {
    prevs[nexts[k]] = prevs[k];
    nexts[prevs[k]] = nexts[k];
}