1074 Reversing Linked List (25 分)
Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given Lbeing 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6.
Input Specification:
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤105) which is the total number of nodes, and a positive K (≤N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.
Then N lines follow, each describes a node in the format:
Address Data Next
where Address
is the position of the node, Data
is an integer, and Next
is the position of the next node.
Output Specification:
For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.
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的取值将链表部分倒序并且重新组成新的链表,再将该链表重新输出。用数组来存储链表,并配合vector来存储结点很方便解决。
注意K的取值使剩余结点不足与满足时,链接会不同。
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
struct node{
int add,data,next;
};
int main()
{
node arr[100000];
int head,n,k;
cin>>head>>n>>k;
int add,data,next;
for(int i=0;i<n;i++){
cin>>add>>data>>next;
arr[add] = node{add,data,next};
}
vector<node> vec;
vector<vector<node>> temp;
for(int i=head;i != -1;i = arr[i].next){
vec.push_back(arr[i]);
if(vec.size() == k)
{
temp.push_back(vec);
vec.clear();
}
}
int flag = 0;
if(vec.size() < k){
temp.push_back(vec);
flag = 1;
}
vector<node> res;
if(flag == 0){
for(int i=0;i<temp.size();i++){
vector<node> vec = temp[i];
for(int j=vec.size()-1;j>=0;j--)
res.push_back(vec[j]);
}
}else{
for(int i=0;i<temp.size()-1;i++){
vector<node> vec = temp[i];
for(int j=vec.size()-1;j>=0;j--)
res.push_back(vec[j]);
}
vector<node> vec = temp[temp.size()-1];
for(int j=0;j<vec.size();j++)
res.push_back(vec[j]);
}
for(int i=0;i<res.size();i++){
printf("%05d %d",res[i].add,res[i].data);
if(i == res.size()-1)
printf(" -1");
else
printf(" %05d\n",res[i+1].add);
}
return 0;
}