因为数组模拟的大部分数据结构都相对于结构体而言,在运行速度上占优势,所以本次双链表我也会用数组模拟的方式来实现,接着上一次的单链表实现,这次再更一波双链表。
(本弱弱之所以用数组来实现链表,是因为结构体看的脑袋疼......数组版本好理解些)
接下来就开始正题吧!
双链表跟单链表有着相似的结构,但不同点在于,双链表的结点可以指向它的上一个位置和它的下一个位置(单链表只能指向它的下一个位置)。
在每个代码的前面,我都给了相应的图解,来尽大可能地帮助大家更好的理解
void init()
{
r[0] = 1, l[1] = 0;//当中初始化的数字可以任意
idx = 2;
}//表明双链表为空链表
双链表的插入操作:在某个结点的位置进行右插入或者是左插入
//其实这两个操作的任意一个操作,另一个操作可以通过调用另一个操作进行实现
//例如:add_r(int k,int x)是在第k个结点进行右插入x,那么左插入的实现就可以是,在k左边的结点进行右插入:add_r(int l[k],int x)
void add_r(int k, int x)//在下标为k的右边插入x
{
e[idx] = x;//1
r[idx] = r[k];//2q
l[idx] = k;//3
l[r[k]] = idx;//4
r[k] = idx;//5
//步骤4和步骤5不能更换顺序
}
void add_l(int k, int x)//在下标为k的左边插入x
{
add_r(l[k], x);
}
删除某一个结点
void remove(int k)//删除第k个结点
{
r[l[k]] = r[k];
l[r[k]] = l[k];
}
总体代码:
#include<iostream>
using namespace std;
const int N = 10010;
int e[N], l[N], r[N], idx;
int m;
void init()
{
r[0] = 1, l[1] = 0;
idx = 2;
}
void add_r(int k, int x)//在下标为k的右边插入x
{
e[idx] = x;//1
r[idx] = r[k];//2
l[idx] = k;//3
l[r[k]] = idx;//4
r[k] = idx;//5
//步骤4和步骤5不能更换顺序
}
void add_l(int k, int x)//在下标为k的左边插入x
{
add_r(l[k], x);
}
void remove(int k)//删除第k个结点
{
r[l[k]] = r[k];
l[r[k]] = l[k];
}
int main()
{
/*你要执行的基本操作*/
}
本文章代码来源于:ACWING中Y总的模板