题目描述:
你有一些小球,从左到右依次编号为1,2,3,…,n,
你可以执行两种指令。其中A X Y表示把小球X移动到小球Y左边,B X Y表示把小球X移动到小球Y右边。指令保证合法,即X不
#include <iostream>
using namespace std;
struct ball
{
int number;
struct ball *next;
};
ball *head=NULL; //定义一个全局变量的头结点
void create(int n) //创建链表函数 ,链表的头结点和尾节点分别设置为编号为
{ //0和n+1的虚构的小球,以方便后续处理
ball *p=head,*s;
for(int i=0;i<=n+1;i++)
{
s=new ball;
s->number=i;
if(head==NULL)
head=p=s;
else
p->next=s;
p=s;
}
p->next=NULL;
}
void output() //链表输出函数,注意头结点和不要输出,因为他们是虚构的
{
ball *p=head;
p=p->next;
while(p->next!=NULL)
{
cout<<p->number<<' ';
p=p->next;
}
}
void deletelist()//链表删除函数,程序执行完后一定要调用此函数,
{ //否则会造成内存泄漏
ball *p=head,*q;
while(p->next!=NULL)
{
q=p;
p=p->next;
delete q;
}
delete p;
head=NULL;
}
void changeA(int num1,int num2) //处理函数1,即把num1放到num2的左边
{
ball *p=head,*q,*s=head;
while(p->number!=num1)
{
q=p;
p=p->next;
}
q->next=p->next;
while(s->number!=num2)
{
q=s;
s=s->next;
}
q->next=p;
p->next=s;
}
void changeB(int num1,int num2)//处理函数2,即把num1放到num2的右边
{
ball *p=head,*q,*s=head;
while(p->number!=num1)
{
q=p;
p=p->next;
}
q->next=p->next;
while(s->number!=num2)
{
s=s->next;
q=s->next;
}
s->next=p;
p->next=q;
}
int main()
{
int n,m;cin>>n>>m;
create(n);
for(int i=0;i<m;i++)
{
char ch;int num1,num2;
cin>>ch>>num1>>num2;
if(ch=='A')changeA(num1,num2);
else changeB(num1,num2);
}
output();
deletelist();
}
Y。
例如,在初始状态下执行A 1 4后,小球1被移动到小球4的左边,如果再执行B 3 5,结点3将会移到5的右边.
输入:输入小球个数n。指令条数m和m条指令,注意,1≤n≤500000,0≤m≤100000。
输出:从左到右输出最后的小球序列。
样例输入
6 2
A 1 4
B 3 5
样例输出
2 1 4 5 3 6
题目来源
刘汝佳《算法竞赛入门经典》