L2-022 重排链表 (25分) 测试点3 坑点解析
发布日期:2021-05-08 02:33:37 浏览次数:23 分类:原创文章

本文共 1314 字,大约阅读时间需要 4 分钟。

题目描述

给定一个单链表 L​1​→L​2​​ →⋯→L​n−1​​ →L​n​​ ,请编写程序将链表重新排列为 L​n​​ →L​1​​ →L​n−1​​ →L​2​​ →⋯。
例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。

输入格式

每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (≤10​5​​ )。结点的地址是5位非负整数,NULL地址用−1表示。

接下来有N行,每行格式为:
Address Data Next
其中Address是结点地址;Data是该结点保存的数据,为不超过10​5​​ 的正整数;Next是下一结点的地址。题目保证给出的链表上至少有两个结点。

输出格式

对每个测试用例,顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。

输入样例

00100 600000 4 9999900100 1 1230968237 6 -133218 3 0000099999 5 6823712309 2 33218

输出样例

68237 6 0010000100 1 9999999999 5 1230912309 2 0000000000 4 3321833218 3 -1

分析

当时卡在测试点3,经过查找相关解析说是有多余节点,后来经过修改就通过了。

C++ 代码

#include<bits/stdc++.h>using namespace std;const int N = 1e5+10;int head,n,co,num1[N],num2[N];struct node{   	int ad;	int data;	int next;}List[N];int main(){   	scanf("%d%d",&head,&n);	int a,d,ne;	for(int i=0;i<n;i++)	{   		scanf("%d%d%d",&a,&d,&ne);		List[a].ad=a;		List[a].data=d;		List[a].next=ne;		}	int k=0; //使用k来对有效节点进行计数,将多余节点排除在外	while(head!=-1)	//没有到-1就一直对有效节点进行查询并用数组num1[]记录	{   		num1[k++]=head;		head=List[head].next;	}    n=k;    //用新的k来更新n,去除多余节点	int l=0,r=n-1;	while(l<=r)	{   		if(l==r)		{   			num2[co]=num1[l++];			}		else{   			num2[co++]=num1[r--];			num2[co++]=num1[l++];			}	}	for(int i=0;i<n-1;i++)	{   		printf("%05d %d %05d\n",num2[i],List[num2[i]].data,num2[i+1]);	}	printf("%05d %d -1",num2[n-1],List[num2[n-1]].data);	return 0;}
上一篇:二、MySQL连接查询学习笔记(多表连接查询:内连接,外连接,交叉连接详解)
下一篇:一、css清除浮动方法学习笔记总结(超详细,简单易懂)

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年03月21日 04时01分49秒