本人是来自双非本科的一只大一菜鸟,加入校队(我是吊车尾┭┮﹏┭┮)已有一个月的时间,现在开始写我的第一篇博客记录我的学习历程,废话不多说,如理解有误,请勘正。
int r[N],l[N],e[N],idx;//r[N]储存该结点后一结点的下标,l[N]储存该结前一结点的下标,e[N]储存该点的值,idx表示插入的次数(即下标)
对于一个一无所有的空链表,我们用0,1来表示它的头结点与尾结点(为空集)。所以接下来进行初始化操作:
//以下标为0的结点为头结点,以下标为1的结点为尾结点
//初始化
void init()
{
r[0]=1;
l[1]=0;
idx=2;//由于已经进行了两次插入头尾结点的操作,所以idx初始化为2(前面是0,1)
}
注意:此时初始的idx已经为2,在解题过程中需注意!!!
链表结点的插入:
//将一结点插入到下标为k的结点的前或后位置处,进行4次指针的变换
//如果要将结点插入至下标为k的结点之前,将add内的实参赋值为(l[k],x)即可
void add(int k,int x)
{
e[idx]=x;//将待插值x插入e[idx]
//将待插结点与前后两结点连接
r[idx]=r[k];//将下标为k的结点的r[k]赋值给插入结点的r[idx]
l[idx]=k;//将k赋值给插入结点的l[idx]
//下面两步操作不能交换顺序
l[r[k]]=idx;
r[k]=idx++;
}
链表结点的删除:链表的删除操作实际上是将指针进行变换使得待删点的前一结点指向待删点的后一结点,从而跳过待删除点,而不是我们通常理解的抹去消除操作,上图理解:
这波操作我称之为孤立无援(#^.^#)
接下来上代码:
//将下标为k的数删除,进行两次指针变换即可
void remove_s(int k)
{
//将待删点的下一结点与待删点的前一结点相互连接
r[l[k]]=r[k];
l[r[k]]=l[k];
}
那么双链表的基本操作就这么多了。练手可去y总的acwing题库:https://www.acwing.com/problem/content/829/
下次再见!!