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 单链表逆转相关推荐

  1. pta:6-1单链表逆转(20分)

    大一下半期数据结构 数据结构实践任务2 pta:单链表逆转 这是一个新手小白学数据结构所经历的所有题目集. 本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( Li ...

  2. 6-1 单链表逆转(PTA数据结构与算法题目集)

    本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; ...

  3. java 链表逆转_java 实现单链表逆转详解及实例代码

    java 实现单链表逆转详解 实例代码: class Node { Node next; String name; public Node(String name) { this.name = nam ...

  4. 6-1 单链表逆转 (20分)两种实现方法。

    本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下:typedef struct Node *PtrToNode; s ...

  5. 6-1 单链表逆转分数 20

    本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; ...

  6. 6-1 单链表逆转 (20分)

    本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; ...

  7. PTA: 6-5 删除单链表偶数节点 (20 分)

    大一下半期数据结构 数据结构题目集 删除单链表偶数节点 本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中偶数值的结点删除. 链表结点定义如下: struct ListNode {int d ...

  8. 【PTA】7-2 单链表基本操作 (25 分)

    请编写程序实现单链表插入.删除结点等基本算法.给定一个单链表和一系列插入.删除结点的操作序列,输出实施上述操作后的链表.单链表数据域值为整数. 输入格式: 输入第1行为1个正整数n,表示当前单链表长度 ...

  9. 以下这段程序将单链表逆转。(单链表不带有空头结点,链表头指针是head)例如,链表 1 -> 2 -> 3 -> 4 逆转后变为 4 -> 3 -> 2 -> 1 .

    struct Node**phead *phead oldHead->next newHead tmp &head #include <stdio.h> #include & ...

  10. Java实现单链表的逆转置

    单链表逆转置的递归与非递归方式 package link.reverse; // 定义一个单链表 class Node { //变量 private int record; //指向下一个对象 pri ...

最新文章

  1. fdisk分区命令详解与fdisk非交互式分区
  2. c语言编制编程语言,C语言CGI编程入门(一)
  3. 使用awk取passwd10-20行然后重定向
  4. python中如何追加_如何在Python中将元素添加到列表中-追加,扩展和插入
  5. web自动化原理揭秘
  6. ArcGIS依据某一字段进行数据分层
  7. 在线教育网校系统源码,搭建可以解决培训考试的教学平台
  8. php博客平台 开源,PHP开源博客Blog - PHP开源网(PHP-OPEN.ORG)
  9. JS实现PDF文件下载
  10. 视频融合应用没听说过?
  11. 906.nethogs安装使用
  12. 三星首次公开投资区块链,布局始于三年前
  13. 轻松制作短视频网页工具:锐视RyView 帮助文档
  14. esp32 spi 驱动 oled 屏显示来自 PC 的画面
  15. JDK1.8新特性Lambda表达式入门
  16. 屏幕分辨率 VGA、HVGA、QVGA、WVGA、WQVGA
  17. 小米官网详情页头部固定效果
  18. NSD ADMIN DAY01
  19. 清除xp,win7快捷方式小箭头
  20. 用两个栈做队列(左程云算法学习)

热门文章

  1. 拼音转汉字算法(隐马尔科夫、维特比算法)
  2. 微信 小程序 APP 渗透测试方案
  3. 如何保证战略落地_如何真正让企业战略规划体系落地
  4. 聊聊如何做技术战略规划
  5. 系统聚类算法并绘制谱系图
  6. 发票校验属于物料管理(MM)模块,发票为财务和成本控制提供付款信息和发票评估。
  7. 【论文】联邦学习区块链 论文集(二)
  8. c#数字验证码功能,以及判断用户输入是否正确。
  9. python中用来返回序列的最大函数_Python内置函数____________用来返回序列中的最大元素。...
  10. 【计几】二维计算几何基础