AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

AcWing 827. 双链表-有注释--C++    原题链接    简单

作者: 作者的头像   Struggle ,  2020-05-22 15:52:12 ,  阅读 712


6


3

注释版

#include<iostream>
using namespace std;
const int N=1e5+10;
int l[N],r[N],index,value[N];
void ini()
{
    //一开始左边界节点指向右边界节点,右边界节点指向左边界节点
    r[0]=1;
    l[1]=0;
    //更新节点索引
    index=2;
}

void insert(int k,int x)//在第k个节点后插入x
{
    //将值赋给新节点
    value[index]=x;
    //将新节点分别指向插入位置的右节点和左节点
    r[index]=r[k];
    l[index]=k;
    //将新节点右边一节点向左指向新节点,将新节点左边一节点向右指向新节点
    l[r[k]]=index;
    r[k]=index;
    //更新节点索引
    index++;
}
void remove(int k)
{
    //删除第k个节点,第k-1的右指针指向原先第k个节点的右指针指向的节点
    r[l[k]]=r[k];
    //删除第k个节点,原先第k个节点的右指针指向的节点的左指针指向原先第k个节点的左指针指向
    //的节点
    l[r[k]]=l[k];
}
int main()
{
    // 0 是左边界  1是右边界
    //因为0和1都被占用,所以第1个节点也就是2=1+1 ,第2个节点为3=2+1;
    //∴第k个节点也就是k+1
    ini();
    int M,k,x;
    string operation;
    cin>>M;//操作个数
    while(M--)
    {
        cin>>operation;//操作指令
        if(operation=="L")//在链表的最左端插入x
        {
            //也就是在左边界后插入一个节点,就是最左端插入一个节点
            cin>>x;
            insert(0,x);
        }
        else if(operation=="R")//在链表的最右端插入x
        {
            //也就是右边界的左节点后插入一个新节点
            cin>>x;
            insert(l[1],x);
        }
        else if(operation=="D")//把第k个插入的数删除
        {
            cin>>k;
            remove(k+1);
        }
        else if(operation=="IL")//第k个插入的数左侧插入一个数
        {
            //也就是在第k个插入的数的左节点后插入一个数
            cin>>k>>x;
            insert(l[k+1],x);
        }
        else//第k个插入的数右侧插入一个数
        {
            //在第k个节点后插入一个数
            cin>>k>>x;
            insert(k+1,x);
        }
    }
    int pos=r[0];
    while(pos!=1)//当指向右边界节点时,循环结束
    {
        cout<<value[pos]<<" ";
        pos=r[pos];
    }
    return 0;
}

无注释版

#include<iostream>
using namespace std;
const int N=1e5+10;
int e[N],r[N],l[N],idx=1;
void init()
{
    r[0]=1;
    l[1]=0;
}
void insert(int k,int x)
{
    e[++idx]=x;
    r[idx]=r[k];
    l[idx]=k;
    l[r[k]]=idx;
    r[k]=idx;
}
void del(int k)
{
    l[r[k]]=l[k];
    r[l[k]]=r[k];
}
int main()
{
    init();
    int m;
    cin>>m;
    while(m--)
    {
        char op[3];
        cin>>op;
        if(op[0]=='L')
        {
            int x;
            cin>>x;
            insert(0,x);
        }
        else if(op[0]=='R')
        {
            int x;
            cin>>x;
            insert(l[1],x);
        }
        else if(op[0]=='D')
        {
            int k;
            cin>>k;
            del(k+1);
        }
        else
        {
            int k,x;
            cin>>k>>x;
            if(op[1]=='L')
                insert(l[k+1],x);
            else
                insert(k+1,x);
        }
    }
    for(int index=r[0];index!=1;index=r[index]) cout<<e[index]<<' ';
}

3 评论


用户头像
菜就该刷题   1个月前     回复

if(operation==”L”)//在链表的最左端插入x
{
//也就是在左边界后插入一个节点,就是最左端插入一个节点
cin>>x;
insert(0,x);
}

这里为什么不能用r[0] ? 用了好像为出问题,但是没想明白


用户头像
未名湖畔的梦   1个月前     回复

代码可以转载吗?

用户头像
Struggle   1个月前     回复

可以

你确定删除吗?

© 2018-2021 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息