给定一个单链表 L1→L2→⋯→L**n−1→L**n,请编写程序将链表重新排列为 L**n→L1→L**n−1→L2→⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。
输入格式:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (≤105)。结点的地址是5位非负整数,NULL地址用−1表示。
接下来有N行,每行格式为:
Address Data Next
其中Address
是结点地址;Data
是该结点保存的数据,为不超过105的正整数;Next
是下一结点的地址。题目保证给出的链表上至少有两个结点。
输出格式:
对每个测试用例,顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。
输入样例:
00100 6
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218结尾无空行
输出样例:
68237 6 00100
00100 1 99999
99999 5 12309
12309 2 00000
00000 4 33218
33218 3 -1结尾无空行
代码:
#include <iostream>
using namespace std;
int main()
{
int a[100001],b[100001],c[100001];
int N;
int init_add,last_add;
cin >> init_add >> N;
int this_add,next_add,data;
for(int i=0;i<N;i++)
{
cin >> this_add >> data >> next_add;
a[this_add]=data;
b[this_add]=next_add;
if(next_add==-1)
{
last_add=this_add;
}
else
c[next_add]=this_add;
}
c[init_add]=-1;
// cout << b[00000] << " %%%" << c[68237]<< endl;
int add1=last_add,add2=init_add;
printf("%05d %d %05d\n",add1,a[add1],add2);
int count=1;
int address;
while(count<N)
{
address=add1;
add1=add2;
add2=c[address];
if(add1==add2)
{
printf("%05d %d -1\n",add1,a[add1]);
break;
}
else
printf("%05d %d %05d\n",add1,a[add1],add2);
//cout << add1 <<" "<< a[add1]<<" " << add2 << endl;
address=add1;
add1=add2;
add2=b[address];
if(add1==add2)
{
printf("%05d %d -1\n",add1,a[add1]);
break;
}
else
printf("%05d %d %05d\n",add1,a[add1],add2);
count+=2;
}
}
第二次的代码:
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
//主要思路:
//定义一个较大的数组,将链表的数值,next指针都用数组来表示
//然后通过数组q[] 来实现队列,记录队列的头指针和尾指针,
//数组q[],按照顺序存储,链表的位置,遍历数组
//通过引用头尾指针,来实现重排来链表
// 注意:倒数第二个测试点测试是一个特殊的情况,即,在输入的结点中,有部分结点实际上是不在链表中的,在计算过程中应该把他们扔掉
int da[N]; //表示这个链表的数
int ne[N]; //表示这个链表的下一个数的位置
int q[N]; //创造一个队列数组
int hh,tt; // hh,tt表示这个队列数组的头指针和尾指针
int main()
{
int head,num;
cin >> head >> num;
// int a,b;
//cin >> a >> b;
//将数据存放到数组里
for (int i = 0; i < num; i ++)
{
int add, data, next_add;
cin >> add >> data >> next_add;
da[add] = data;
ne[add] = next_add;
}
//将地址放入队列中
int dd = head;
hh = 0;
tt = -1;
// for (int i = 0; i < num; i ++) //这种情况有可能会把可能不在这个链表的数也加入到队列中
while (dd != -1) //判断条件应该是 是否是最后一个结点 -1
{
q[++ tt] = dd;
dd = ne[dd];
}
while(hh < tt)
{
if(hh < tt)
{
printf("%05d %d %05d\n", q[tt], da[q[tt]], q[hh]);
tt --;
}
if(hh < tt)
{
printf("%05d %d %05d\n", q[hh], da[q[hh]], q[tt]);
hh ++;
}
}
printf("%05d %d -1\n", q[tt], da[q[tt]]);
}