ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

链表应用------PAT_B1025 反转链表 (25 分)

2021-02-10 18:01:37  阅读:188  来源: 互联网

标签:node 25 结点 PAT 输出 int 整块 链表 address


题目

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. 定义静态链表,用order表示结点位置
  2. 初始化,order初始化为maxn
  3. 从begein开始遍历链表,并用count++赋值给order,方便后面排序
  4. sort排序,count从0开始
  5. 按要求输出,此题比较麻烦。首先将链表分成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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有