C ++ 数组模拟单/双链表

120 阅读2分钟

作用:

数组模拟单/双链表在算法竞赛中运用广泛,可用于存储图和树,用单链表记录所有可到达的结点,相比于传统链表速度更快,内存泄漏问题竞赛中一般无需考虑。

数组模拟单链表:

int head , e[N]  ,  ne[N] , idx;
// head存储链表头指针
// e[i] 记录该结点的值
// ne[i] 记录该结点的next指针
   

代码模板:

#include <iostream>

using namespace std;

int head , e[N] , ne[N] ,idx;

//初始化
void init(){
    head = -1;
    idx = 0;
}
//插入头结点
void add_to_head(int x){
    e[idx] = x;
    ne[idx] = head;
    head = idx;
    ++idx;
}
//在k后插入结点
void add(int k, int x){
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    ++idx;
}
//删除头结点
void remove(){
    head = ne[head];
}
//删除k后面的结点
void remove(int k){
    ne[k] = ne[ne[k]];    
}
//遍历链表
for(int i = head; i != -1; i = ne[i]){
    cout << e[i] << ' ';
}

数组模拟双链表

int e[N],r[N],l[N],idx;
// e[i] 记录该结点的值
// r[i] 记录该结点的右指针
// l[i] 记录该结点的左指针
int e[N],r[N],l[N],idx;
//初始化
void init(){
    l[1] = 0; //模拟head
    r[0] = 1; //模拟tail
    idx = 2;  //head与tail占用
}
//在k右边插入值为x的结点
void add(int k, int x){
    e[idx] = x;   //记录x
    r[idx] = r[k]; //将idx的右结点设置为k的右结点
    l[idx] = k;  //将idx的做结点设置为k
    l[r[k]] = idx; // 将原先k的右结点的左结点设置为idx
    r[k] = idx; //最后将k的右结点设置为idx
    ++idx;
}
//将k结点删除
void remove(int k){
    r[l[k]] = r[k];  //将k左结点的右结点设置为k的右结点
    l[r[k]] = l[k];  //将k右结点的左结点设置为k的左结点
}
//遍历双向链表
for(int i = r[0]; i != 1; i = r[i]){
    cout << e[i] << ' ';
}

感谢各位观看,欢迎交流~~~