1025. 反转链表 (25)
给定一个常数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<iostream>
#include<iomanip>
using namespace std;
struct Node {
int address;
int value;
Node* next;
inline Node() {
this->next = NULL;
}
};
void print_node(Node* node) {
if(node->next == NULL)
return;
node = node->next;
while(node != NULL) {
cout << setw(5) << setfill('0') << node->address;
cout << ' ' << node->value << ' ';
if(node->next != NULL)
cout << setw(5) << setfill('0') << node->next->address << '\n';
else
cout << "-1\n";
node = node->next;
}
}
void scope_reverse(Node* head, int scope, int times) {
if(head == NULL || scope == 0 || times == 0)
return;
Node *current, *temp;
current = head->next;
while(times--) {
int s = scope;
while(current->next != NULL && s--) {
temp = current->next;
current->next = temp->next;
temp->next = head->next;
head->next = temp;
}
head = current;
current = head->next;
}
}
int get_total(Node* head) {
int total = 0;
while(head->next != NULL) {
total++;
head = head->next;
}
return total;
}
int main() {
int head_address, total, reverse;
ios::sync_with_stdio(false);
cin >> head_address >> total >> reverse;
Node all[100000];
int nextads[total];
for(int i = 0;i < total;i++) {
int add, nextad;
cin >> add;
all[add].address = add;
cin >> all[add].value >> nextad;
if(nextad == -1){
all[add].next = NULL;
}else
all[add].next = &all[nextad];
}
if(head_address == -1) {
cout << "-1\n";
return 0;
}
Node* head = new Node();
head->next = &all[head_address];
total = get_total(head);
int scope = reverse - 1;
int times = total > reverse ? total / reverse : 1;
scope_reverse(head, scope, times);
print_node(head);
}
PS.
原本想即使不做链表反转,用下标也能完成这个输出的任务,但是想了想还是复习一下链表反转吧。
然后在网上看到真的有人不写链表反转做这道题。。。
Nice Job!