3-3 数据结构--双向链表

实现接受以下指令的双向链表。

insert x:在链表的开头添加一个键为 x 的元素。
delete x:从链表中删除第一个键为 x 的元素。如果不存在这样的元素,则什么都不做。
deleteFirst:删除列表中的第一个元素。
deleteLast:删除列表中的最后一个元素。
输入
输入按以下格式给出:

n
command1
command2
...
commandn

第一行给出了指令数 n。接下来的 n 行给出了n个指令。该指令是上述四个指令之一。

  • insert x
  • delete x
  • deleteFirst
  • deleteLast

输出
完成所有指令后,依次输出链表中的键。输出由一个空格字符分隔的连续键。

约束
指令数不超过2,000,000。
删除指令不超过20条。
0 ≤ 键值 ≤ $10^9$。
指令过程中链表的元素个数不超过$10^6$个。
当给定 delete、deleteFirst 或 deleteLast 指令时,列表中有一个或多个元素。

 题目分析:本题的难点是在于如何判断语句的类型?insert语句比较好判断,3个delete语句就比较难判断了,我们不妨直接找同,通过判断q[6]的单词不同来区别deletefirst和deletelast,最后只要判断s[0]是否是d就能将3个delete语句全部区分出来。其次是delete的删除问题,我们的解决方法是通过迭代器遍历找到第一个符合条件的number,将其删去即可。

AC代码:

#include<iostream>
#include<list>
using namespace std;
list<int> s;
list<int>::iterator p;//定义一个迭代器
int main()
{
    int n;
    cin>>n;
    //循环n次语句
    while(n--)
    {
        string q;
        int number;
        cin>>q;
        //insert语句
        if(q[0]=='i')
        {
            cin>>number;
            s.push_front(number);
        }
        //deletefirst语句
        else if(q[6]=='F')
        {
            s.pop_front();
        }
        //deletelast语句
        else if(q[6]=='L')
        {
            s.pop_back();
        }
        //delete x语句
        else if(q[0]=='d')
        {
            cin>>number;
            for( p=s.begin();p!=s.end();p++)
            {
                if(*p==number)
                {
                    s.erase(p);
                    break;
                }
            }
        }
    }
    for( p=s.begin();p!=s.end();p++)
    {
        cout<<*p<<" ";
    }
    cout<<endl;
    //system("pause");
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温柔济沧海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值