小猴子摆玩具
小猴子有一天迷上了排队的游戏,他手上有标号为 1~10 的 10 个玩具,现在小猴子将它们排成一列,可小猴子不确定到底想把哪个玩具摆在哪里,直到最后才能排成一条直线,求玩具的编号。已知他排了 M 次,每次都是选取标号为X的放到最前面,求每次排完后玩具的编号序列。
M,表示小猴子排玩具的次数。随后 M 行,每行包含一个整数 X,表示小猴子要把编号为 X 的玩具放在最前面。
把1~10这10个数据存到10个节点toy[1]~toy[10]
小技巧:toy[0]始终是链表的头,但是不用它存数据,真正的数据在它的后面。当链表的时候,直接从toy[0]开始即可。
#include <bits/stdc++.h>
using namespace std;
struct node{
//int id; //没用到
int data;
int nextid;
}toy[20];
void init(){ //初始化链表
toy[0].nextid = 1; //节点0是链表头,它指向下一个节点1
toy[10].nextid = -1; //最后的节点10指向 -1,表示没有后续节点
for (int i = 1; i <= 10; i++) {
toy[i].data = i; //节点的值
toy[i].nextid = i + 1; //指针,指向下一个节点
}
}
void tohead(int x){ //把x放到最前面
int p = 0; //p是x的前一个节点
}
while(toy[p].nextid != -1){ //遍历链表,查找x的前一个节点p
if (toy[toy[p].nextid].data == x) break;
p = toy[p].nextid;
}
int now = toy[p].nextid; //now是x所在的节点
toy[p].nextid = toy[now].nextid; //删除x节点
toy[now].nextid = toy[0].nextid;
toy[0].nextid = now; //把x放到最前面
}
void out(){ //输出链表,就是题目的编号序列
int head = toy[0].nextid; //toy[0]始终是链表头,并且不用来存编号
for (int i = 1; i <= 10; i++){
cout << toy[head].data << ' ';
head = toy[head].nextid;
}
cout << endl;
}
int main(){
init();
int m;
cin >> m;
while (m--){
int x;
cin >> x;
tohead(x);
out();
}
return 0;
}