Doubly Linked List

Doubly Linked List

题目:
Your task is to implement a double linked list.
Write a program which performs the following operations:
insert x: insert an element with key x into the front of the list.
delete x: delete the first element which has the key of x from the list. If there is not such element, you need not do anything.
deleteFirst: delete the first element from the list.
deleteLast: delete the last element from the list.
Input
The input is given in the following format:
n
command1
command2

commandn
In the first line, the number of operations n is given. In the following n lines, the above mentioned operations are given in the following format:
insert x
delete x
deleteFirst
deleteLast
Output
Print all the element (key) in the list after the given operations. Two consequtive keys should be separated by a single space.
Constraints
The number of operations ≤ 2,000,000
The number of delete operations ≤ 20
0 ≤ value of a key ≤ 109
The number of elements in the list does not exceed 106
For a delete, deleteFirst or deleteLast operation, there is at least one element in the list.
Sample Input 1
7
insert 5
insert 2
insert 3
insert 1
delete 3
insert 6
delete 5
Sample Output 1
6 1 2
Sample Input 2
9
insert 5
insert 2
insert 3
insert 1
delete 3
insert 6
delete 5
deleteFirst
deleteLast
Sample Output 2
1

代码如下:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,num;
    char a[20];
    list<int> q;
    scanf("%d",&n);
    for(int i = 0;i < n;i++)
    {
        scanf("%s",a);
        if(a[0] == 'i')
        {
            scanf("%d",&num);
            q.push_front(num);
        }
        else if(a[6] == 'L') q.pop_back();
        else if(a[6] == 'F') q.pop_front();
        else if(a[0] == 'd')
        {
            scanf("%d",&num);
            for(list<int>::iterator it = q.begin();it != q.end();it++)
            {
                if(*it == num)
                {
                    q.erase(it);
                    break;
                }
            }
        }
    }
    int i = 0;
    for(list<int>::iterator it = q.begin();it != q.end();it++)
    {
        if(i++) cout << " ";
        cout << *it;
    }
    cout << endl;
    return 0;
}

这里用到list代表的是双向链表。list既可以像vector一样通过“[ ]”运算符直接访问特定元素,也可以用迭代器逐个进行访问。另外,list还具备一项vector所不具备的特长,那就是元素的插入与删除操作只需o(1)既可完成,效率极高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值