#include <iostream>
#include <map>
#include <cstdio>
using namespace std;
struct LNode{
int data;
int next;
};
map<int, LNode> m;
int reverse(int head, int K);
int find_tail(int head, int K);
int cal_size(int head);
int main(){
int Head, Tail, N, K, start;
int data, address, next;
cin >> Head >> N >> K;
for(int i = 0; i < N; i++){
cin >> address >> data >> next;
m[address] = {data, next};
}
N = cal_size(Head);//计算链表长度
if( N - K >= 0){
start = reverse(Head, K);//找到逆转后链表的起始点
Tail = find_tail(start, K);
Head = m[Tail].next;
N -= K;
}
while( N - K >= 0){
Head = reverse(Head, K);
m[Tail].next = Head;//将上一次逆转的表尾,接到新的链表头
Tail = find_tail(Head, K);
Head = m[Tail].next;
N -= K;
}
while(m[start].next != -1) {
printf("%05d %d %05d\n",start, m[start].data, m[start].next);
start = m[start].next;
}
printf("%05d %d %d\n",start, m[start].data, m[start].next);
return 0;
}
int reverse(int head, int K){
int cnt = 1;
int New = head;
int Old = m[head].next;
int Tmp;
while( cnt < K ){
Tmp = m[Old].next;
m[Old].next = New;
New = Old;
Old = Tmp;
cnt++;
}
m[head].next = Old;
return New;
}
int find_tail(int head, int K){
int tail = head;
for(int i = 1; i < K; i++)
tail = m[tail].next;
return tail;
}
int cal_size(int head){
int cnt = 1;
while(m[head].next != -1){
head = m[head].next;
cnt++;
}
return cnt;
}
02-线性结构3 Reversing Linked List
于 2023-11-11 19:22:44 首次发布