链表问题1

来源:互联网 发布:网络的好处英语作文 编辑:程序博客网 时间:2024/06/02 07:01

有一些小球,从左到右依次编号1,2,3….n,执行两种指令。A X Y 表示把小球X移动到Y左边,B X Y 表示把小球X移动到Y的右边,保证指令合法,即X不等于Y。

这里写图片描述

分析:
1.用数组做也可以,但是如果反复执行B 1 n和A 1 2,则每次都移动几乎所有元素。
2.用链表做,强调相对顺序而非绝对顺序,可以用left[i]和right[i]分别表示左边和右边的小球编号(如果是0,表示不存在)。即使想象还有一个编号为0的小球(最后小球指向0就是循环链表),一切都不会有问题。

#include<iostream>#include<cstdio>#include<cstdlib>using std::cin;using std::cout;using std::endl;const int maxn=500000 + 50; int left[maxn],right[maxn],n,t; void link(int a,int b){    right[a]=b;    left[b]=a;}    int main(){     cin >> n;     for(int i=1;i<=n;i++) { left[i]=i-1; right[i]=i+1;}     right[n]=0;     cin >> t;     for(int i=1;i<=t;i++){         int X,Y;         char c;         c=getchar();         while(c!='A'&&c!='B') c=getchar();         cin >> X >> Y;         link(left[X],right[X]);         if(c=='B'){             //X .. Y-> .. Y X right[Y]             link(X,right[Y]);             link(Y,X);                      }         else {//A             //X .. Y -> .. X Y             link(left[Y],X);             link(X,Y);         }     }     int head;     for(head=1;head<=n&&left[head]!=0;head++);     cout << head<<" ";     while(right[head]!=0){         head=right[head];         cout << head<<" ";     }         cout << endl;     return 0;}     
0 0
原创粉丝点击