链表应用------PAT_B1025 反转链表 (25 分)
作者:互联网
题目
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 个元素不反转。
思路
- 定义静态链表,用order表示结点位置
- 初始化,order初始化为maxn
- 从begein开始遍历链表,并用count++赋值给order,方便后面排序
- sort排序,count从0开始
- 按要求输出,此题比较麻烦。首先将链表分成n/k个整块,设从第i个整块的 位置最后 结点开始输出( 位置第一 结点是 输出最后 结点,题意如此),当输出至最后一个结点时,需要分情况处理(是否为最后整块):
一. 该整块不是最后整块,“输出最后”结点应指向下一整块的“位置最后”结点
( 即node[(i+2)*k-1 )
二.是最后整块。此时又要分情况处理(是否有多余结点):
---------(一)没有多余结点,直接输出“-1”
---------(二)有多余结点,“输出最后”结点应指向紧接最后整块的第一个结点,再按顺序输出多余结点。同样注意对-1的特殊处理。
代码实现
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 100010
struct Node{
int address, data, next;
int order;
}node[maxn];
bool cmp( Node a, Node b ){
return a.order < b.order;
}
int main(void)
{
for( int i = 0; i < maxn; i++ ){
node[i].order = maxn;
}
int begin, n, k;
scanf( "%d%d%d", &begin, &n, &k );
int address;
for( int i = 0; i < n; i++ ){
scanf( "%d", &address);
scanf( "%d%d", &node[address].data, &node[address].next );
node[address].address = address;
}
int count = 0, p = begin;
while( p != -1 ){
node[p].order = count++;
p = node[p].next;
}
sort( node, node + maxn, cmp );
n = count;
//按要求输出
for( int i = 0; i < n/k; i++ ) {//遍历整块,从0开始
for( int j = (i + 1)*k-1; j > i*k; j-- ){
//从整块最后结点开始输出,输出最后一个结点时特殊处理
printf( "%05d %d %05d\n", node[j].address, node[j].data, node[j-1].address );
//此时已经排序完成,数组下标为0-n
}//特殊处理每整块最后一个结点
printf("%05d %d ", node[i*k].address, node[i*k].data);
//结点的address,data域正常输出,注意有空格
//输出每整块最后结点的“指针”时,判断是否是最后一个整块
if( i < n/k - 1 )
//不是最后整块的最后结点,整块是从0开始计数i<n/k即表示最后整块
printf( "%05d\n", node[(i+2)*k-1].address );
//不是最后整块,输出下一整块“位置最后”结点的位置
else{
//是最后整块的最后结点还要判断是否有多余结点
if( n % k == 0 )
//没有多余结点
printf("-1\n");
else{
printf("%05d\n", node[(i+1)*k].address);
//有多余结点输出紧接该整块的第一结点位置
for( int q= (i+1)*k; q < n; q++ ){
//再顺序输出其他结点
printf("%05d %d ",node[q].address, node[q].data );
if( q < n-1 )
//注意链表结束时指向-1要特殊处理
printf( "%05d\n", node[q + 1].address);
else
printf("-1\n");
}
}
}
}
return 0;
}
参考书《算法笔记》
标签:node,25,结点,PAT,输出,int,整块,链表,address 来源: https://blog.csdn.net/weixin_42734804/article/details/113783965