数组模拟链表

一个链表需要实现的功能:插入,修改,删除

#include <iostream>
using namespace std;
const int N=1e6;
int e[N]; //e[i]表示第i个插入的值是e[i]
int ne[N]; //表示第i+1个插入的值的位置
int idx; //idx记录当前是第几个插入的数
int head;

单向链表

初始化:

void initialize()
{
    head=-1;  //表头指向-1   相当于*head=NULL
    idx=0;      //idx记录当前是第几个插入的数
}

链表末端指向-1

插入:

//从表头插入一个数
void add_to_head(int x)
{
    e[idx]=x;
    ne[idx]=head;
    head=idx++;
}

//再第a个插入的数后插入b
void add(int a,int b) 
{
    e[idx]=b;
    ne[idx]=ne[a]; //当前的点指向原来a指向的位置
    ne[a]=idx++;  //a指向当前点的位置
}

假的删除:

//删除第a个插入的数后面的数
void del(int a)
{
    ne[a]=ne[ne[a]];//直接让a指向其下一个数所指的数
}

只能删除第n个插入的数后面的数,因为链表只能从前指向后

双向链表

在开一个数组,存前一个数的地址即可

int e[N],l[N],r[N],idx;

初始化;

void initialize()
{
	l[1] = 0;
	r[0] = 1;
	idx = 2;  //表头和表位各站一个,所以从2开始
}

在第a个插入的数右插入一个数
在做边插入只需add(l[a],x)即可

void add(int a,int x)
{
	e[idx] = x;
	l[r[k]] = idx;
	r[idx] = r[k];//x这个数的左右两边都要建立边,方法同单链表
	r[k] =idx;
	l[idx++] = k;
}

假的删除:
让x左边的数直接指向x右边的数
让x右边的数直接指向x左边的数

void del(int a)
{
	r[l[a]] = r[a];
	l[r[a]] = l[a];
}

这样就可以删掉第a个插入的数了

数组模拟链表数组模拟链表 撒阔以欧豆豆喲 发布了5 篇原创文章 · 获赞 1 · 访问量 29 私信 关注
上一篇:数据结构_链表及邻接表


下一篇:过山车 HDU - 2063