题目:1074 Reversing Linked List (25分)
题意
给N个链表结点,以及K,对每K个长度的链表做逆置,输出逆置后的链表。
Sample Input:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
Sample Output:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
解法
构造链表,一趟遍历,顺序存入数组,每k个进行翻转。
ps:vector数组,reverse翻转(手动模拟翻转有两个点过不了,真菜啊!!!,欢迎指出错误)
code
/***************************
Hello World!
***************************/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int head;
int k;
struct node{
int key;
int ne;//5位地址
}List[100005],temp;
vector<node>a;
int main()
{
scanf("%d%d%d",&head,&n,&k);
for(int i=1;i<=n;i++) {
int add,key,ne;
scanf("%d%d%d",&add,&key,&ne);
List[add].key=key;
List[add].ne=ne;
}
int p=head,j=-1;
while(p!=-1)
{
++j;
temp.key=List[p].key;
temp.ne=p;
a.push_back(temp);
p=List[p].ne;
}
//有的结点不在
//为什么用reverse就可以,自己模拟有bug??
int m=a.size()/k;//可以翻转m次
for(int i=0;i<m;++i)
{
reverse(a.begin()+i*k,a.begin()+i*k+k);
}
for(int i=0;i<a.size();i++)
{
if(i!=(a.size()-1)) printf("%05d %d %05d
",a[i].ne,a[i].key,a[i+1].ne);
else printf("%05d %d -1
",a[i].ne,a[i].key);
}
//为什么手动模拟过不了呢,哪有逻辑错误。。。
// int i=0;
// while(i<=j)
// {
// if(i+k-1<=j) {
// for(int x=i+k-1;x>=i;--x)
// {
// printf("%05d %d ",a[x].ne,a[x].key);
// if(x==i) {
// if(i+k<=j) printf("%05d
",a[i+k].ne);
// else printf("-1
");
// }
// else {
// printf("%05d
",a[x-1].ne);
// }
// }
// }
// else {
// for(int x=i;x<=j;++x)
// {
// printf("%05d %d ",a[x].ne,a[x].key);
// if(x==j) {
// printf("-1
");
// }
// else {
// printf("%05d
",a[x+1].ne);
// }
// }
// }
// i+=k;
// }
return 0;
}
/***************************
The end!
***************************/
总结
还是STL好