前言:通过数组模拟,了解双链表的结构和基本题型,插入,删除.
1.双链表的初始化
e[idx]存储该点的数据
l[idx]该点左边结点的下标
r[idx]该点右边结点的下标
idx从该点开始存储,数组一般从0开始.
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100010;
int idx,e[N],l[N],r[N];
void init()
{
r[0]=1;
l[1]=0;
idx=2;
}
2.在双链表最左端插入元素
<结合图理解>
void insertL(int x)
{
l[idx]=0;
r[idx]=r[0];
l[r[0]]=idx;
r[0]=idx;
e[idx++]=x;
}
3.在双链表最右端插入元素
void insertR(int x)
{
r[idx]=1;
l[idx]=l[1];
r[l[1]]=idx;
l[1]=idx;
e[idx++]=x;
}
4.删除第K个插入的数
void Delete(int k)
{
r[l[k]]=r[k];
l[r[k]]=l[k];
}
5.在第K个插入的数的右边插入一个数据
void insertKR(int k,int x)
{
l[idx]=k;
r[idx]=r[k];
l[r[k]]=idx;
r[k]=idx;
e[idx++]=x;
}
6.在第K个插入的数的左边插入数据
void insertKL(int k,int x)
{
r[idx]=k;
l[idx]=l[k];
r[l[k]]=idx;
r[k]=idx;
e[idx++]=x;
}
注意:在主函数中,第K个插入的数,传入的数是k+1.<k-1+2>