题目描述:
有n辆自行车依次来到停车棚,除了第一辆自行车外,每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边。(e.g.停车棚里已经有3辆自行车,从左到右编号为:3,5,1。现在编号为2的第4辆自行车要停在5号自行车的左边,所以现在停车棚里的自行车编号是:3,2,5,1)。给定n辆自行车的停放情况,按顺序输出最后停车棚里的自行车编号。
思路及解决: 一开始很容易想到用数组去解决,但是有个问题,每次添加车辆后都需要重新排序,很麻烦,而且不知道所要参考车辆的前面多少才会不空。于是顺着就想到了用双链表解决,直接插入就可以了,但是也有个问题,如果仅仅用双链表的话,我们还是需要不断遍历去寻找到所要参考的车辆,存在超时的可能,于是顺着这个思路就想到了在每次添加车辆的时候,不妨把这个车辆编号的地址记录下来即arry[查找的车辆的编号] = 它的地址。
c代码如下:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
typedef struct Link
{
int data;
struct Link *next;
struct Link *pre;
} LinkNode;
int mian()
{
LinkNode*H,*p,*q;
H = (LinkNode*)malloc(sizeof(LinkNode));
int n, x, y, z, i;
n = x =y = z = 0;
LinkNode *arry[100002];
scanf("%d %d",&n,&x);
H->data = x;
H->next = NULL;
H->pre = NULL;
arry[x] = H;
for(i = 0; i<n-1; i++)
{
scanf("%d %d %d",&x,&y,&z);
p = (LinkNode*)malloc(sizeof(LinkNode));
p->data = x;
arry[x] = p; //记录编号的地址;
q = arry[y]; //获取之前记录编号的地址;凡是之前记录过的都在arry里面,这里只需要获取题目中所给的编号为y的地址;
if(z==0)
{
if(q->pre!=NULL)
{
p->next = q;
q->pre->next = p;
p->pre = q->pre;
q->pre = p;
}
else
{
p->next = q;
p->pre = NULL;
q->pre = p;
H = p;
}
}
else
{
if(q->next!=NULL)
{
p->next = q->next;
p->pre = q;
q->next->pre = p;
q->next = p;
}
else
{
q->next = p;
p->pre = q;
p->next = NULL;
}
}
}
for(p = H; p!=NULL; p = p->next)
{
printf("%d ",p->data);
}
return 0;
}