c++-C++ PAT数据结构基础02-1题 反转单链表

问题描述

C++ PAT数据结构基础02-1题 反转单链表

题目大意:反转单链表,给定常数K和单链表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.

输入说明:每次输入一个案例,对每个案例,第一行内容是链表第一个节点的地址,节点数N(N<=100,000)(不一定是最终形成的单链表的节点数),常数K(<=N),K是需要反转的子链表的长度,节点的地址是一个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

我的代码如下:
/* PAT数据结构基础习题02-1题 */
#include
using namespace std;

const int Maxn=100001;
typedef struct{
int addr;
int value;
int nextaddr;
}Node; //结构数组元素,存储三个元素
typedef struct tagnode{
Node *n;
struct tagnode *nextp;
}LNode; //链表节点,用于存储下一节点地址,和数组元素地址

int main()
{
Node nodes[Maxn]; //建立数组来存储输入的信息,排列顺序根据输入的顺序值
int firaddr,num,k;
cin>>firaddr>>num>>k;
nodes[0].value=num;
nodes[0].addr=nodes[0].nextaddr=0; //数组大小为100001,存储从1开始,因而0节点随意赋值
int i,j;
Node pnode;
for(i=0;i
{
cin>>pnode.addr>>pnode.value>>pnode.nextaddr;
nodes[pnode.value]=pnode;
}
// for(i=1;i<=num;i++)
// {
// cout<
// cout
// cout
// }
LNode *head,*pt; //建立LNode的链表
head->n=&nodes[0];
head->nextp=NULL; //头结点的初始化
pt=head;
for(i=0;i
{
for(j=k;j>0;j--)
{
LNode *pp=new LNode;
pp->n=&nodes[i*k+j];
pt->nextp=pp;
pt=pt->nextp;
delete pp;
}
}
if(i*k
{
for(j=1;i*k+j
{
LNode *pp=new LNode;
pp->n=&nodes[i*k+j];
pt->nextp=pp;
pt=pt->nextp;
delete pp;
}
}
pt->nextp=NULL; //将链表结尾节点下一地址置为空
pt=head->nextp; //pt指针移动到头指针的下一节点,开始循环输出
while(pt!=NULL)
{
cout<n->addr<<" "<n->value<<" "<n->nextaddr<
pt=pt->nextp;
}
return 0;
}
求大神指导啊!!!

解决方案

看了你的程序,感觉你的解题思路如下:
(1)把输入全部读取到nodes的数组中,并且以data为下表存放
(2)从data=k开始向前扫描nodes到1,并且把扫描结果存放到以head开头的链表中,
(3)从max data开始向前扫描nodes到k+1,并且把扫描结果添加到上述链表中,
(4)输出链表
不知道我的理解是否正确。解题思路应该没有什么大问题。
但是这样有一个局限性,也就是输入数据中的data必须从1到n要连续存在。否则nodes[x]会不存在。而题目对输入数据并没有这样的限制。不知道我对题目的理解是否正确。
我觉得算法和数据结构上还可以稍作优化。
可以用nodes数组直接存储输入的链表结构,以nodes下标为地址,value域存储data,nextaddr存储指向的下一个地址。
计算时可以利用堆栈,按以下步骤计算:
(1)从nodes链表的头看是扫描,并且把每个节点压入堆栈,直到node.value == K。并且记住K的下标。
(2)把堆栈中的节点弹出并且打印。
(3)从K的下标开始直到N,扫描并且重复(1)(2)。

另外如果题目允许使用双向链表,也可以把nodes设计成双向链表,读取输入完成后,扫描nodes,补充完成preaddr指针。接下来从K的节点开始反向扫描链表并且打印就行。

另外程序设计上有一个严重问题。在扫描nodes保存到链表的过程中,不能delete pp。因为pp所申请的空间用于链表存储,以后还要用到。应该在打印完成后,扫描并且删除链表,释放空间。

时间: 2024-12-22 16:08:09

c++-C++ PAT数据结构基础02-1题 反转单链表的相关文章

C++数据结构分别用顺序表和单链表的存储形式

问题描述 C++数据结构分别用顺序表和单链表的存储形式 分别用顺序表和单链表的存储形式实现将输入的两个大整数(超过20位)相加并打印和值:自行设计基本操作,要求两种存储结构中操作接口相同 解决方案 数据结构-----顺序表与单链表的实现 解决方案二: 存储结构的引入是为了将大数字分解成若干个小数字么? 解决方案三: 大数相加必须,分解成若单个小数字呀,采用哪个储存结构只是题目要求而已,用数组也可以实现代码如下#include #include int main() { char str1[100

数据结构之自建算法库——单链表

本文针对数据结构基础系列网络课程(2):线性表中第10课时单链表基本操作的实现,建立单链表数据存储结构基本操作的算法库. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 单链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:linklist.h,包含定义顺序表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef LINKLIST_H_INCLUDED #define LINKLIST_H_INCLUDED typedef

【算法数据结构Java实现】Java实现单链表

1.背景           单链表是最基本的数据结构,仔细看了很久终于搞明白了,差不每个部分,每个链都是node的一个对象.需要两个参数定位:一个是index,表示对象的方位.另一个是node的对象. 2.代码 node类 public class Node { protected Node next; protected int data; public Node(int data){ this.data=data; } public void display(){ System.out.p

《算法基础》——3.2 单链表

3.2 单链表 在一个单链表中,每个单元格由一个单链路连接到下一个单元格.图3-1所示的链表即是单链表. 如果要使用一个链表,就需要一系列算法来遍历链表.将项添加到链表中.查找链表中的项.删除链表中的项.以下各节将描述一些可能需要使用的算法.3.2.1 遍历链表 假设一个程序已经建立了一个链表,遍历它的单元格是比较容易的.下面的算法展示了如何遍历链表中的单元格,并使用某种方法对单元格中的值进行处理.本例中使用Print方法来显示单元格的值,但也可以用其他任何方法来代替Print方法对单元格进行操

数据结构的C++实现之线性表之链式存储结构以及单链表反转

为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据ai,除了存储其自身的信息之外,还需存储一 个指示其直接后继的信息(即直接后继的存储位置).这两部分信息组成数据元素ai的存储映像,称为结点(Node).N个 结点链结成一个链表,即为线性表(a1,a2,...,an)的链式存储结构,因为此链表的每个节点中只包含一个指针域,所以叫 做单链表. 我们把链表中的第一个结点的存储位置叫做头指针,,为了更方便地对链表进行操作,如删除第一个结 点的特殊情况(第一个结点没有前驱,而要摘除一

数据结构的C++实现之程序加图示分析单链表的插入和删除操作

下图展示了单链表的基本结构: head指针是链表的头指针,指向第一个节点 ,每个节点的next指针域指向下一个节点,最后一个节点的next指针域为NULL,在图中用0表示. 下面先来看程序( 栈的链式存储实现,另外一个实现点这里)和对应的输出(注意输出前进行了链表反转(见<单链表反转>,否则程序后面 的while循环输出的顺序是250,200,100),接着来分析程序: /* linkedlist.h */#ifndef LINKEDLIST_H#define LINKEDLIST_Htype

“数据结构基础”系列网络课程主页

前言 自从下决心要解决学生动手能力差的问题,开始了课程实践资源的建设之旅:自迷上了翻转课堂,所教课程的视频,也就逐渐形成了体系.在为我自己的校内学生服务的同时,也希望能够让更多人有机会用到. 自全身心投入教学,收入.奖金的渠道也便收缩到了极致.接受CSDN学院商业运作的规则,将课程投放此处,一则创收一些,弥补付出数倍精力建设资源而只能喝大锅饭中稀粥中的不平衡,二则因免费带来的不珍惜也让自己有些不快.课程定价大概等值于一张景区门票,或者一块生日蛋糕,愿者自行决定. 为天下IT学子服务的诺言不变,为

数据结构基础 伸展树

问题描述 数据结构基础 伸展树 为什么我自己画出来的展开的树和书上的不一样呢,是哪步旋转错了么? 解决方案 数据结构 - 树(基础)数据结构基础(3)-------------树第六章数据结构基础之树部分 解决方案二: 图看不清,谁知道你问的啥.

Python基础02 基本数据类型

原文:Python基础02 基本数据类型 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   简单的数据类型以及赋值   变量不需要声明 Python的变量不需要声明,你可以直接输入: >>>a = 10 那么你的内存里就有了一个变量a, 它的值是10,它的类型是integer (整数). 在此之前你不需要做什么特别的声明,而数据类型是Python自动决定的. >>>print a >>&