如何用单向链表实现双向作用?
某火车站铁轨铺设如图,有n节车厢自A方向进入车站,按进站方向编号为1~n。现对其进行编组,编组过程可借助中转站C,其中C可停靠任意多车厢,由于C末端封顶,故驶入C的车辆必须按相反方向驶出。对每个车厢,一旦自A进入C,就不能再驶入A;且一旦自C驶入B,再不能返回C。给定n值,请判断某个车厢编组是否可能。Input
输入由许多块组成。除了最后一块,每块描述了一列火车,而且可能有多组重构要求。每块的第一行是上文中提到的整数N,接下来每行是1, 2, ..., N的一个排列,该块的最后一行只包含一个0。
最后一块只包含一个0。
Output
对应的判定结果。 每组测试样例之间用空行隔开。
Sample Input
5
1 2 3 4 5
5 4 1 2 3
0
6
6 5 4 3 2 1
0
0
Sample Output
Yes
No
Yes
我用单向做的
#include<stdio.h>
#include<stdlib.h>
struct train{
int num;
struct train *next;
};
train *creat(int n)
{
struct train *p1,*p2,*p3;
int i=n;
p1=new train;
p1->next=NULL;
while(i>0)
{
p2=new train;
p2->num=i;
p2->next=p1->next;
p1->next=p2;
if(i==n)
{
p3=p1;
}
i--;
}
return p3;
}
int main()
{
struct train *head,*p1,*p2,*p0,*p3;
int n,a[100];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
head=creat(n);
p0=new train;
p1=new train;
p2=new train;
p3=new train;
p4=new train;
p0=NULL;
p0->next=head->next;
while(p0->num!=a[i])
{
p3=p0;
p0=p0->next;
}
p1=p0;
p2=p0->next;
printf("%d",p0->num);
p3->next=NULL;
p1->next=NULL;
for(i=1;i<n;i++)
{
if(a[i]==p3->num)
{
printf("%d",p3->num);
}
if(a[i]>=p2->num)
{
p3->next=p2;
while(p2->num!=a[i])
{
p4=p2;
p2=p2->next;
}
printf("%d",p2->num);
p3=p4;
p4->next=NULL;
p2=p2->next;
}
}
return 0;
}
求解:有表情那块要用单连实现双连,要删除 p3,把p3指向原来指向的节点的前一个,肿么做???