题目描述:
小红拿到了一个数组,初始数组为空,她希望你实现以下两种操作:
1. 输入x,y,将x插入在元素y的右边。保证此时数组中没有元素等于x,且数组中存在一个y。特殊的,如果将x插入在数组的最左边,则y=0
2. 输入x,将元素x删除。
请你在所有操作后输出整个数组。
先说一下结构体模拟链表的操作:
第一种操作:将某一个元素b删除
想一想,b的右边的左边等于b的左边,例如 a b c,让b的左边也就是a指向b的右的左边边也就是c,从表示为:a→c,同时第二行,让b的右边也就是c指向b的左边的右边也就是a,表示为c→a,这样就把a和c连在了一起,相当于把b给删除了
局部代码如下:
lst[lst[b].r].l = lst[b].l;lst[lst[b].l].r = lst[b].r;
第二种操作:把一个元素插在另一个元素的后面这里拿出一个把y插在x后面举例子:我们这里要实现x→y,首先,引入一个中间量temp作为桥梁
让temp先在x的右边,就是相当于把temp放在了中间,然后二三步实现xy的互相指向,让temp再指向y的右边,实现一个从头到尾的遍历
局部代码如下:
temp = lst[x].r;lst[x].r = y;lst[y].l = x;lst[y].r = temp;lst[temp].l = y;
遍历/存放链表:
一个temp指针一直往右指,直到指到头为止
temp = lst[0].r;L sum = 1;while (temp != 0x3f){ans[sum++] = temp;temp = lst[temp].r;}
本题代码如下
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
typedef long long L;
using namespace std;
int n;
L temp = 0x3f;
struct Node {L l, r;
};
L ans[2000005];
//存答案
map<L, Node>lst;
//结构体模拟链表
int main()
{lst[0].r = 0x3f;//定义链表的初始lst[0x3f].l = 0;//初始化链表cin >> n;while (n--){int a, b, c;cin >> a;if (a == 1)//插入{cin >> b >> c;temp=lst[c].r;lst[c].r = b;lst[b].l = c;lst[b].r = temp;lst[temp].l = b;}else//删除{cin >> b;lst[lst[b].r].l = lst[b].l;lst[lst[b].l].r = lst[b].r;}}//模拟输出链表temp = lst[0].r;L sum = 1;while (temp != 0x3f){ans[sum++] = temp;temp = lst[temp].r;}cout << sum - 1<<endl;for (int i = 1; i <= sum - 1; i++){cout << ans[i] << " ";}return 0;
}