数据结构C++双链表(数组模拟)

在基于之前学习的数组模拟的单链表,https://blog.csdn.net/qq_63055790/article/details/135653461

来学习使用数组模拟双链表。

双链表顾名思义是基于单链表只能只有一个朝后指向的指针,双链表是每个节点前后都有的。

具体长相就酱紫:

然后我们默认最左端的头结点是0,最右端的结点是1。

init:初始化给最左右的两个节点赋值。

add:在k节点右边添加一个新的节点。

数据结构C++双链表(数组模拟)_第1张图片

remove:删除k节点

数据结构C++双链表(数组模拟)_第2张图片

代码模板:

#include
using namespace std;

const int N=1e5+10;
//双链表
int e[N],l[N],r[N],idx;

//初始化
void init()
{
    //0表示左端点,1表示右端点
    idx=2;
    r[0]=1;
    l[1]=0;
}

//在下标是k的点的右边,插入x
void add(int k,int x)
{
    e[idx]=x;
    l[idx]=k;
    r[idx]=r[k];
    
    //顺序不可改变
    l[r[k]]=idx;
    r[k]=idx;
    
    idx++;
}

//删除第k个点
void remove(int k)
{
    r[l[k]]=r[k];
    l[r[k]]=l[k];
}

int main()
{
    
    
    return 0;
}

例题:https://www.acwing.com/activity/content/problem/content/864/

#include
using namespace std;

const int N=1e5+10;
//双链表
int e[N],l[N],r[N],idx;

//初始化
void init()
{
    //0表示左端点,1表示右端点
    idx=2;
    r[0]=1;
    l[1]=0;
}

//在下标是k的点的右边,插入x
void add(int k,int x)
{
    e[idx]=x;
    l[idx]=k;
    r[idx]=r[k];
    
    //顺序不可改变
    l[r[k]]=idx;
    r[k]=idx;
    
    idx++;
}

//删除第k个点
void remove(int k)
{
    r[l[k]]=r[k];
    l[r[k]]=l[k];
}

int main()
{
    int n;
    cin>>n;
    init();
    while(n--)
    {
        string op;
        cin>>op;
        int k,x;
        if(op=="L")
        {
            cin>>x;
            add(0,x);
        }
        if(op=="R")
        {
            cin>>x;
            add(l[1],x);
        }
        if(op=="D")
        {
            cin>>k;
            remove(k+1);
        }
        if(op=="IL")
        {
            cin>>k>>x;
            add(l[k+1],x);
        }
        if(op=="IR")
        {
            cin>>k>>x;
            add(k+1,x);
        }
    }
    
    //遍历
    for(int i=r[0];i!=1;i=r[i])
    cout<

 注:题目中要求的是第 k个插入的数并不是指当前链表的第 k 个数。所以我们需要在带入add和remove的时候需要给k+1,因为0, 1 节点的作用是边界。0为左边界,1为右边界。他俩在这里有点类似保留字的作用。所以idx是从2开始,所以要给我们相应的k+1。

你可能感兴趣的:(c++,开发语言)