题意:
给出k,链表L,L中每k个数位置反转。第一行输入首地址,输入的数量,k,然后按该位置地址,数据,下一个位置地址输入,NULL用空表示。按该位置地址,数据,下一个位置地址形式输出。
解法:
定义两个100000的数组data和nextadd,将输入的数据存入,然后根据首地址循环遍历,存入vector数组中,这样可以去掉多余的数据。然后操作存入另一个数组中,按特定形式输出。
总结:
一开始题目看错了,以为是反转前k个就够了,后来发现不是这样,改回来后成功提交,算是不难的一题。
(用时:57:32.76)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<cstring>
#include<cmath>
//#include<bits/stdc++.h>
using namespace std;
int data[100000];
int nextAdd[100000];
int main()
{
int n,firstAddress,k;
scanf("%d%d%d",&firstAddress,&n,&k);
int address,d,nAddress;
for(int i=0; i<n; i++) {
scanf("%d%d%d",&address,&d,&nAddress);
data[address] = d;
nextAdd[address] = nAddress;
}
vector<int> linkList;
int fAddress = firstAddress;
while(fAddress!=-1) {
linkList.push_back(fAddress);
fAddress = nextAdd[fAddress];
}
vector<int> reverseList = linkList;
if(k>linkList.size()) {
k=linkList.size();
}
int t = linkList.size() / k;
int s=0;
for(int i=0; i<=t;i++){
int start = i*k+k-1;
int theEnd = i*k;
if(start>=linkList.size()){
break;
}
for(int j=start; j>=theEnd; j--) {
reverseList[s++] =linkList[j];
}
}
for(int j=0; j<reverseList.size(); j++) {
if(j==0) {
printf("%05d %d",reverseList[j],data[reverseList[j]]);
} else {
printf(" %05d\n%05d %d",reverseList[j],reverseList[j],data[reverseList[j]]);
}
}
printf(" -1\n");
return 0;
}