PAT甲级 1074 Reversing Linked List 反转链表
Solution:
题目要求:反转链表的元素,每k个元素进行一次反转。
注意:链表中可能存在无效结点。
代码如下:
//反转链表中元素的位置#include<iostream>#include<vector>#include<algorithm>#include<stdio.h>using namespace std;structNode{intaddr;intkey;intnext;}node[100005];intn,k;//n个结点,k个结点为一个子串intstart_pos;//开始位置vector<Node>vec;bool exist[100005];intmain(){cin>>start_pos>>n>>k;intaddress;for(inti=0;i<n;i++){cin>>address;node[address].addr=address;exist[address]=true;cin>>node[address].key>>node[address].next;}intprev=-1;while(true){//链成链表Node temp;temp.addr=node[start_pos].addr;temp.key=node[start_pos].key;temp.next=node[start_pos].next;vec.push_back(temp);start_pos=node[start_pos].next;if(start_pos==-1||!exist[start_pos]){break;}}intans=0;bool flag=true;for(inti=0;i<vec.size();i++){if(ans<k){ans++;}if(ans==k){for(intj=i;j>=i+1-k;j--){if(flag){printf("%05d %d",vec[j].addr,vec[j].key);//cout<<vec[j].addr<<" "<<vec[j].key;flag=false;}else{printf(" %05d\n%05d %d",vec[j].addr,vec[j].addr,vec[j].key);//cout<<" "<<vec[j].addr<<endl;//cout<<vec[j].addr<<" "<<vec[j].key;}}ans=0;}}if(ans!=0){for(inti=vec.size()-ans;i<vec.size();i++){printf(" %05d\n%05d %d",vec[i].addr,vec[i].addr,vec[i].key);//cout<<" "<<vec[i].addr<<endl;//cout<<vec[i].addr<<" "<<vec[i].key;}}cout<<" -1";return0;}