给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4;如果 K 为 4,则输出应该为 4→3→2→1→5→6,即最后不到 K 个元素不反转。
输入格式:
每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (≤105)、以及正整数 K (≤N),即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。
接下来有 N 行,每行格式为:
Address Data Next
其中 Address
是结点地址,Data
是该结点保存的整数数据,Next
是下一结点的地址。
输出格式:
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。
输入样例:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
解题思路:
自己写了一坨还有两个样例过不了:
#include <bits/stdc++.h>
using namespace std;
typedef struct point
{
string _address;
int _data;
struct point *_next;
}*List;
struct vec
{
int _data_vec;
string _address_vec;
string _next_vec;
};
int main()
{
//初始化
List head = new point();
cin >> head->_address;
head->_next = NULL;
//总数
int num;
cin >> num;
//反转数
int n;
cin >> n;
//记录输入
vector<vec> v;
while(num--)
{
vec p;
cin >> p._address_vec >> p._data_vec >> p._next_vec;
v.push_back(p);
}
for(auto &elem : v)
{
if(elem._address_vec == head->_address)
{
head->_data = elem._data_vec;
break;
}
}
List t = head;
while(true)
{
List new_point = new point();
bool b = true;
for(auto &elem : v)
{
if(elem._address_vec == t->_address)
{
new_point->_address = elem._next_vec;
if(elem._next_vec == "-1")
{
b = false;
break;
}
break;
}
}
if(!b)
{
break;
}
for(auto &elem : v)
{
if(elem._address_vec == new_point->_address)
{
new_point->_data = elem._data_vec;
new_point->_next = NULL;
break;
}
}
new_point->_next = t->_next;
t->_next = new_point;
t = new_point;
}
deque<pair<int,string>> d;
t = head;
while(n--)
{
d.push_front({t->_data,t->_address});
t = t->_next;
}
while(t && t->_next != NULL)
{
d.push_back({t->_data,t->_address});
t = t->_next;
}
if(t)
{
d.push_back({t->_data,t->_address});
}
for(auto &elem : d)
{
if(elem.first != d.begin()->first)
{
cout << elem.second << "\n" << elem.second << " " << elem.first << " ";
}
if(elem.first == d.begin()->first)
{
cout << elem.second << " " << elem.first << " ";
}
}
cout << -1;
return 0;
}
后来发现自己连题都没看完,是每n次反转一遍,不是反转前n次
在看完大佬的题解后模仿写了一遍过了:
1,设置3个数组data,next,list
data存储数据,next存储下一个节点的地址,list存储链表,三个数组均以地址的形式存储(例:10001地址的节点全部存储于data[10001],next[10001],并且在list中存储10001表示该节点)
2,每n次反转一次
3,输出
c++代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
int data[100005], next[100005], list[100005];
int temp, sum, n;
cin >> temp >> sum >> n;
for (int i = 0; i < sum; ++i) {
int num;
cin >> num;
cin >> data[num] >> next[num];
}
//创建链表
int t = 0;
while (temp != -1) {
list[t++] = temp;
temp = next[temp];
}
//每n次旋转一次
for (int i = 0; i < (t - t % n); i += n)
{
reverse(list + i, list + i + n);
}
//输出
for (int i = 0; i < t - 1; i++)
{
printf("%05d %d %05d\n", list[i], data[list[i]], list[i + 1]);//正则表达式
}
//最后一个节点需要特殊输出
printf("%05d %d -1", list[t - 1], data[list[t - 1]]);
return 0;
}
标签:一千,No.0039,int,list,next,链表,vec,address,data
From: https://blog.csdn.net/2301_76783671/article/details/139332652