1注意是毎k个元素实现翻转,不是前k个;
反转的for循环要想是怎么写的:因为翻转所以想到reverse,且在algorithm中;
这样写是错的:因为C++STL的迭代器,这里就是.begin()和.end(),不允许访问超过他们的范围,如果像下面这样写,那么当i+k>v.size()时,reverse的第二个参数就超出范围了
for(int i=0;i<v.size();i+=k)
{
reverse(v.begin()+i,v.begin()+i+k);
}
这样写是对的:你可以预判
for(int i=0;i<v.size();i+=k)
{
if(i+k<=v.size())
{
reverse(v.begin()+i,v.begin()+i+k);
}
}
这也是对的:不过可能没那么好想,他就是以i为下标,每k个一组翻转的时候,i一定能保证不超出v.size(),思考角度是站在i是翻转0~k-1下标元素
for(int i=k-1;i<v.size();i+=k)
{
reverse(v.begin()+i-k+1,v.begin()+i+1);
}
2最后一个元素的next是-1,这个你得自己设置,因为你不知道翻转之后最后一个数是不是还是原来示例中的最后一个数
3这里用map实现vector数组元素地址一一排序很妙;
完整代码:
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
struct Node{
string add;
int data;
string next;
};
map<string,Node> ma;
vector<Node> v;
int main(){
string firstadd;int n,k;
cin>>firstadd>>n>>k;
//存入
for(int i=0;i<n;i++)
{
Node tempnode;
cin>>tempnode.add>>tempnode.data>>tempnode.next;
ma[tempnode.add]=tempnode;
}
//借助map,动态数组就是有序的,比如123456
while(firstadd!="-1")
{
v.push_back(ma[firstadd]);
firstadd=ma[firstadd].next;
}
//翻转前k个数
// reverse(v.begin(),v.begin()+k);
for(int i=k-1;i<v.size();i+=k)
{
reverse(v.begin()+i-k+1,v.begin()+i+1);
}
for(int i=1;i<v.size();i++)
{
v[i-1].next=v[i].add;
}
v[v.size()-1].next="-1";
// cout<<endl;
for(int i=0;i<v.size();i++)
{
cout<<v[i].add<<" "<<v[i].data<<" "<<v[i].next<<endl;
}
return 0;
}
/*
00100 6 3
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
*/