移动小球-C++-链表实现

题目描述:

你有一些小球,从左到右依次编号为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

题目来源

刘汝佳《算法竞赛入门经典》

猜你喜欢

转载自blog.csdn.net/achenjie/article/details/81090710