@Achievek

6-1 单链表逆转 (20 point(s))

本题要求实现一个函数,将给定的单链表逆转。

##函数接口定义:

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

居中的图片:

##代码入下

**

方法一:就地逆转或者说双链表逆转

思路在注释中 这种方法是最常用的方法 时间复杂度O(n) 空间复杂度

如果上面的没看懂就看下面的分析

总体分为循环核心操作与循环连接操作.
具体来说就是新建一个结构体指针prev,让其初始时指向NULL,然后让链表L的第一个元素指向prev(NULL),这样做形象地说就是将第一个元素从原始链表L剪下,并粘在了prev的前面,形成了新的链表List2;下一次循环的核心操作也是如此,即将第二个元素从被剪后的原始链表中(我们记作List’,L的第二个元素也就是List’的第一个元素)剪下,粘到List2上;但需要注意此时L的指向已经发生改变,故不能直接进行下一次循环操作,还需要一些循环连接操作,使循环得以进行.

那循环连接操作应该怎样做呢?

我们需要一个引入临时指针,在每次循环中指向着List’(第一次循环就是L)的第二个元素.这样,我们就可以保证每一次循环之后,我们都能找到List’的第一个元素,这是为了我们下一次的"剪"做铺垫.
那贴呢?由于我们并没有移动prev,它还指着NULL呢,于是我们就必须让prev也同时往前指,每次循环中都指向刚刚粘过来的元素.,
最后我们只要让L再指向刚刚临时指针temp指向的位置,就能保证下一次能直接把L所指元素直接剪下来拉.这样循环连接操作就完成拉>_
**
代码如下:

//
List Reverse( List L )
{List prev=NULL;//初始时先让prev指向NULLList temp=L;//定义一个临时指针while(temp){temp=temp->next;//让临时指针每次循环时指向下一次要剪掉的元素,这是循环连接操作L->next=prev; //将L/L'的第一个元素从L/L'中剪下,粘到L2上,并指向prev,这是循环核心操作prev=L;//将prev往前指,使得下一次剪下来的元素能够粘到新链表L2的头,这是循环连接操作L=temp;//L返回临时指针所指位置,使得下一次可以直接将其剪下,这是循环连接操作
}return prev;
}

第二种方法:创建新节点法

具体来说就是,新建一个节点,然后让该节点的值等于链表第一个元素的值;再通过遍历原时链表,每次得到下一节点的值,再利用头插法插入到新链表的前面.这种思路有暴力解决内味儿了,时间复杂度O(n),空间复杂度O(n)

  List Reverse(List L)
{if (!L) exit(0);List head = L;List t;t = (List)malloc(sizeof(Node));t->Next = NULL;while (head&&head->Next){t->Data = head->Data;head = head->Next;List q;q = (List)malloc(sizeof(Node));q->Data = head->Data;q->Next = t;t = q;}return t;
}

## 第三种方法:递归
递归的核心思想是将原问题化为更小规模的子问题;
所以我们先从简单情况入手
假设原链表只有一个结点p1,我们只需返回p1结点即可
假设原链表有两个...
生病了 回头补思路

链表逆置(三种方法详解)相关推荐

  1. 新浪微博怎么推广引流,微博推广引流的三种方法详解

    新浪微博怎么推广引流,微博推广引流的三种方法详解,#推广#营销 微博营销有哪些特点?#百收网SEO@千行助推 大家好,上一次内容讲了生意人如何将客户引流到自己的微信上去,受到很多朋友的喜爱,那么这一期 ...

  2. python 命令-python解析命令行参数的三种方法详解

    这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...

  3. 查看登陆系统用户的信息的三种方法详解

    查看登陆系统用户的信息的三种方法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.who这个命令显示可以谁在登陆,但是这个有很多的花式玩法,这个命令超简单 语法:who [O ...

  4. C语言求最大公约数三种方法详解

    C语言求最大公约数三种方法详解 题目要求 常用写法(穷举法) 辗转相减法 辗转相除法 main函数 整体代码 题目要求 运行最大公约数的常用算法,并进行程序的调式与测试. 常用写法(穷举法) 从两个数 ...

  5. eclipse java 逆向工程_Mybatis 逆向工程的三种方法详解

    Mybatis 逆向工程 逆向工程通常包括由数据库的表生成 Java 代码 和 通过 Java 代码生成数据库表.而Mybatis 逆向工程是指由数据库表生成 Java 代码. Mybaits 需要程 ...

  6. C语言 链表逆置四种方法 超详细

    链表逆置 C语言 创建所需的相关结构体 struct List {int date;struct List* next; }; 首先我们创建一个函数用于创建链表的. 建立创建链表的函数 struct ...

  7. 三种方法详解斐波那契数列

    本文同步.md文件,在展示上会有些许问题 原始版本在语雀平台.请各位移步查阅. 代码保存在码云平台供有需要者下载阅览. 本文采用暴力递归,带备忘录的递归,以及动态规划求解斐波那契数列.不到之处,欢迎指 ...

  8. Spring通过工厂创建对象的三种方法详解(工厂设计模式)

    1.场景描述 在创建对象的过程中,常常创建出的对象并不能直接使用,它可能需要若干步复杂的步骤,处理完成后才能正常使用.比如有一个网络连接的类NetConn,类中有加载配置文件的方法load(),测试网 ...

  9. Php 链式执行,PHP实现链式操作的三种方法详解

    本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具体如下: 在php中有很多字符串函数,例如要先过滤字符串收尾的空格,再求出其长度,一般的写法是: strlen(trim($str) ...

最新文章

  1. DataGrid的使用
  2. python类的静态属性和静态方法_详解Python中的静态方法与类成员方法
  3. windows下spark开发环境配置
  4. Android 优秀博客汇总
  5. 关于AI与高性能计算加速融合,这里有英伟达最新的4个应用案例
  6. redhat配置java环境
  7. ruby 从入门到放弃-第一节-hello world
  8. 《道德经》「人法地 地法天 天法道 道法自然」
  9. 加拿大教授 武 计算机,加拿大卡尔加里大学Yingxu Wang教授访问计算机学院
  10. java 短连接转长连接_HTTP的长连接和短连接转换接口(API)
  11. 海康威视SDK告警上传功能整合到springboot(一)
  12. 隐藏微信小程序返回首页按钮(小房子)
  13. Db2 SQL PL中的控制语句
  14. 几何画板在教学中的作用
  15. N个人都不坐自己位置的情况有几种
  16. exe停止运行C语言,处理win7应用程序已停止“异常代码c0000005”的方法
  17. java微信网页支付_java实现微信H5支付
  18. findbugs常见错误总结
  19. (硬件设计)老工程师的经验之道
  20. 我们在讲的 Database Plus,到底能解决什么样的问题?

热门文章

  1. 被遗忘的角落-CMMI的团队管理
  2. Java hashCode详解
  3. 叠片过滤器:叠片过滤器使用注意事项
  4. php网盘 开源 web版 手机版
  5. 国内最火的10款Java开源项目
  6. with dlz mysql 条件_BIND+DLZ+MYSQL
  7. css 侧栏跟随_简单代码实现智能侧边栏跟随固定浮动的效果
  8. 答案揭晓 | 关于云基础架构,你了解多少?
  9. 企业以太坊联盟:区块链挑战者
  10. 计算机主机的拆卸步骤,电脑主板怎么拆CPU 主板拆CPU步骤图文教程