PTA 6-1 单链表逆转
PTA 6-1 单链表逆转
1.题目
函数接口定义:
List Reverse( List L );
其中List
结构定义如下:
typedef struct Node *PtrToNode;
struct Node {ElementType Data; /* 存储结点数据 */PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
L
是给定单链表,函数Reverse
要返回被逆转后的链表。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {ElementType Data;PtrToNode Next;
};
typedef PtrToNode List;List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */List Reverse( List L );int main()
{List L1, L2;L1 = Read();L2 = Reverse(L1);Print(L1);Print(L2);return 0;
}/* 你的代码将被嵌在这里 */
输入样例:
5
1 3 4 5 2
输出样例:
1
2 5 4 3 1
2. 实现代码
1. 1.0版本
List Reverse(List L){if(!L) return NULL;if(!L->Next) return L;List p=L;List p0=NULL;int count=0;while(p->Next){count++;p0=p;p=p->Next;}List Head=p;p->Next=p0;p0->Next=NULL;for(int i=0;i<count-1;i++){p=L;p0=NULL;while(p->Next){p0=p;p=p->Next;}p->Next=p0;p0->Next=NULL;}return Head;
}
- 这是我最初的思路,就是先找到这个链表的尾结点,同时标记尾结点的前驱结点,将尾结点的指针指向前驱结点,然后前驱结点的指针赋值成NULL,成为新的尾结点。重复这个过程,就能将链表反转。虽然这个代码没有超出题目的时间限制,但是不难看出,它的时间复杂度已经到达了O(n^2)。这显然不是我们想要的结果。
2. 2.0版本
List Reverse(List L){if(!L) return NULL;if(!L->Next) return L;List pointer[10000];int i=0;List p=L;while(p){pointer[i++]=p;p=p->Next;}p=L;for(int j=i-1;j>=1;j--){pointer[j]->Next=pointer[j-1];}pointer[0]->Next=NULL;return pointer[i-1];
}
- 为了降低时间复杂度,我用一个数组(有赌的成分,因为根本就不知道链表有多长)记录每个结点的指针,然后通过这个数组对链表进行了反转。这样虽然成功的将时间复杂度降到了O(n),但是却浪费了很多的空间。
3. 最终版本
List Reverse(List L){List p=L;List new;L=NULL;while(p){new=p;p=p->Next;new->Next=L;L=new;}return L;
}
- 后来经过思考,发现其实完全可以在遍历链表的同时,对已经遍历过的结点进行操作(这样不会影响后续的结点)。首先将p赋值成L,然后L赋值为NULL,作为新的链表的头结点。在遍历结点的过程中,L是当前新链表的头结点。每遍历一个结点,首先将p转交给new,然后p指向下一项(如果先对new进行操作,则会导致链表指针错乱),之后将new添加到新链表中,之后将L更新。时间复杂度O(n)。
3. 总结
- 初入数据结构,经验不足,最终答案好像是最简单最简洁最通俗易懂的,但是往往开始的思路却是那么复杂。不过每次改进算法,也是一种成长。没有人一入武林便是高手,没有人一入乱世便是英雄。成长总是渐进的,努力前行吧。
PTA 6-1 单链表逆转相关推荐
- pta:6-1单链表逆转(20分)
大一下半期数据结构 数据结构实践任务2 pta:单链表逆转 这是一个新手小白学数据结构所经历的所有题目集. 本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( Li ...
- 6-1 单链表逆转(PTA数据结构与算法题目集)
本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; ...
- java 链表逆转_java 实现单链表逆转详解及实例代码
java 实现单链表逆转详解 实例代码: class Node { Node next; String name; public Node(String name) { this.name = nam ...
- 6-1 单链表逆转 (20分)两种实现方法。
本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下:typedef struct Node *PtrToNode; s ...
- 6-1 单链表逆转分数 20
本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; ...
- 6-1 单链表逆转 (20分)
本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; ...
- PTA: 6-5 删除单链表偶数节点 (20 分)
大一下半期数据结构 数据结构题目集 删除单链表偶数节点 本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中偶数值的结点删除. 链表结点定义如下: struct ListNode {int d ...
- 【PTA】7-2 单链表基本操作 (25 分)
请编写程序实现单链表插入.删除结点等基本算法.给定一个单链表和一系列插入.删除结点的操作序列,输出实施上述操作后的链表.单链表数据域值为整数. 输入格式: 输入第1行为1个正整数n,表示当前单链表长度 ...
- 以下这段程序将单链表逆转。(单链表不带有空头结点,链表头指针是head)例如,链表 1 -> 2 -> 3 -> 4 逆转后变为 4 -> 3 -> 2 -> 1 .
struct Node**phead *phead oldHead->next newHead tmp &head #include <stdio.h> #include & ...
- Java实现单链表的逆转置
单链表逆转置的递归与非递归方式 package link.reverse; // 定义一个单链表 class Node { //变量 private int record; //指向下一个对象 pri ...
最新文章
- fdisk分区命令详解与fdisk非交互式分区
- c语言编制编程语言,C语言CGI编程入门(一)
- 使用awk取passwd10-20行然后重定向
- python中如何追加_如何在Python中将元素添加到列表中-追加,扩展和插入
- web自动化原理揭秘
- ArcGIS依据某一字段进行数据分层
- 在线教育网校系统源码,搭建可以解决培训考试的教学平台
- php博客平台 开源,PHP开源博客Blog - PHP开源网(PHP-OPEN.ORG)
- JS实现PDF文件下载
- 视频融合应用没听说过?
- 906.nethogs安装使用
- 三星首次公开投资区块链,布局始于三年前
- 轻松制作短视频网页工具:锐视RyView 帮助文档
- esp32 spi 驱动 oled 屏显示来自 PC 的画面
- JDK1.8新特性Lambda表达式入门
- 屏幕分辨率 VGA、HVGA、QVGA、WVGA、WQVGA
- 小米官网详情页头部固定效果
- NSD ADMIN DAY01
- 清除xp,win7快捷方式小箭头
- 用两个栈做队列(左程云算法学习)
热门文章
- 拼音转汉字算法(隐马尔科夫、维特比算法)
- 微信 小程序 APP 渗透测试方案
- 如何保证战略落地_如何真正让企业战略规划体系落地
- 聊聊如何做技术战略规划
- 系统聚类算法并绘制谱系图
- 发票校验属于物料管理(MM)模块,发票为财务和成本控制提供付款信息和发票评估。
- 【论文】联邦学习区块链 论文集(二)
- c#数字验证码功能,以及判断用户输入是否正确。
- python中用来返回序列的最大函数_Python内置函数____________用来返回序列中的最大元素。...
- 【计几】二维计算几何基础