pat乙1025-反转链表

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
*/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值