实现接受以下指令的双向链表。
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;
}