请勿盗用*

#include <bits/stdc++.h>
using namespace std;
struct node{
	int v;
	node *next;
};
int main(){
	node *head=new node({1,0});
	int n,x,y,z;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x>>y;
		if(x==1){
			cin>>z;
			node *p=head;
			while(p->v!=y&&p!=NULL){
				p=p->next;
			}
			node *s=new node({z,p->next});
			p->next=s;
		}else if(x==2){
			node *p=head;
			while(p->v!=y&&p!=NULL){
				p=p->next;
			}
			if(p->next==0){
				cout<<0;
			}else{
				cout<<p->next->v;
			}
			cout<<'\n';
		}else{
			node *p=head;
			while(p->v!=y&&p!=NULL){
				p=p->next;
			}
			p->next=p->next->next;
		}
	}
	return 0;
}

维护一张初始只有元素 1 的表,支持以下操作:

1 x y:将元素 y 插入到 x 后;
2 x:询问 x 后面的元素是什么;
3 x:从表中删除 x 后的元素。
如果有操作二,输出一个数字,并换行。

我们依旧可以看成一些人在排队,只不过多了一个插队和走人的操作。

我们假设初始排队顺序为:1 4 2 3。

若 5 号同学插队到 4 号的后面,那么会发生什么?

我们先来看看初始的链表情况:

i	  1	2	3	4
nxt 4	3	0	2
此时,5 号同学插入 4 号的后面,那么链表就会变为:

i	  1	2	3	4	5
nxt 4	?	0	?	?


此时 2 4 号的位置发送变化,我们一个一个的分析:

2 号的后面没有影响,所以 2 号的后面依旧是 3 号;
5 号插到了 4 号的后面,所以 5 号的后面将会是原本 4 号后面的人,所以 5 号的后面为 2 号;
4 号的后面插进了一个 5 号,所以 4 号的后面变为 5 号。
所以整个链表变为:
 i	1	2	3	4	5
nxt 4	3	0	5	2


这时,2 号同学离开了队伍,那么又会发送什么?

那么链表会变为:

i	1	2	3	4	5
nxt 4	before 3	0	5	?
5 号的后面原本是 2 号,但是 2 号离开了,2 号原本的后面是 3 号,所以 5 号的后面变为了 3 号。
所以变为:

i	  1	3	4	5
nxt 4	0	5	3

话不多说赶紧自己做一遍吧!

1 条评论

  • 1