C/C++数据结构---单链表逆转(PTA)

这篇具有很好参考价值的文章主要介绍了C/C++数据结构---单链表逆转(PTA)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人主页:

仍有未知等待探索_数据结构,C语言疑难,小项目-CSDN博客

专题分栏:

数据结构_仍有未知等待探索的博客-CSDN博客

目录

一、前言

二、题目

函数接口定义:

裁判测试程序样例:

输出样例:

三、理解+代码

1.理解

2.分析 

3.代码 


一、前言

        对于初次学习数据结构,一定要把最基础的,最简单的样例给写的十分熟练,自己每写一遍也将会增加对其结构的理解,为接下来更难的知识打好坚实的基础 !一定一定不要一味的照着别人的代码敲,最后一定要自己独自去写!

二、题目

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

函数接口定义:

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

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

三、理解+代码

1.理解

在看到这道题目的时候,可能会突然感觉很熟悉,好像是跟前学过的字符串逆转很相似。

字符串逆转的思路很多样:

一、非递归:就是用两个变量,一个变量left指向字符串的第一个字符,另一个变量right指向字符串的最后一个字符,然后进行交换,判断一下结束的标志就好了。(关键代码如下)

while(left<right)
{
    //交换
}

二、递归,根据递归的特性来实现逆序

#include<stdio.h>
int my_strlen(char* arr)
{
	if (*arr != '\0')
		return 1 + my_strlen(arr + 1);
	else
		return 0;
}
char* rev(char* arr)
{
	char tmp = *arr;
	int len = my_strlen(arr);
	*arr = *(arr + len - 1);
	*(arr + len - 1) = '\0';
	if (my_strlen(arr+1) >=2)
		rev(arr + 1);
	*(arr + len - 1) = tmp;
}
int main()
{
	char arr[] = "abcdef";
	rev(arr);
	printf("%s", arr);
	return 0;
}

问:那说回来,单链表逆序是不是也可以采用这样的方式呢?

答:1、如果用第一种思路的话,指向最后节点的指针如何往前移呢,这得需要用要一个一重循环来找到只想最后节点的前一个节点的地址,比较麻烦。2、如果用第二种思路的话,就在纸上写一写的话,感觉是能用的,这就交给大家一个小小的思考题(根据上述的递归写法来进行仿照,看看能不能实现)。

2.分析 

那除了字符串逆转的用的那些思路,还有没有根据链表的特性来完成这个单链表的逆转呢?

在创建链表的时候,我介绍过两种方法,一种是头插法,另外一种是尾插法,这两种方法有什么特点呢?各位还记得吗?(不记得的链接如下:)数据结构---顺序表---链式存储结构1(不带头节点)_仍有未知等待探索的博客-CSDN博客 

头插法和尾插法最本质的特征就是创建完,数据的存储顺序与输入数据的顺序。 头插法是存储顺序与输入数据的顺序相反,尾插法是存储顺序与输入数据的顺序相同。

所以,根据头插法的思路,我们可不可以将单链表的数据一个个的按顺序读取出来,然后在用头插法新建一个链表进行存储呢?答案是可以的。而且这种方式的话比之前的思路更简便、更加体现了链表的一些特性。

  //头插法不需要对head是否为空进行判断,再之前的文章中也讲解过。

3.代码 

List Reverse( List L )
{
    List p=L,head=NULL,q;//创建一个头指针
    //头插法不需要对head是否为空进行判断,再之前的文章中也讲解过
    while(p!=NULL)
    {
        q=(List)malloc(sizeof(struct Node));
        q->Next=NULL;
        q->Data=p->Data;
        q->Next=head;
        head=q;
        p=p->Next;
    }
    if(L!=NULL)
        L->Next=NULL;
    return head;
}

 谢谢大家的支持!文章来源地址https://www.toymoban.com/news/detail-729432.html

到了这里,关于C/C++数据结构---单链表逆转(PTA)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】数据结构-单链表

    主页:114514的代码大冒险 qq:2188956112(欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ ) Gitee:庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言(链表的优势) 一、单链表是什么 二、单链表操作的具体代码实现 1.准备工作 2.打印链表 2.尾插(在链表末端添加数据) 3、头插(

    2024年02月02日
    浏览(35)
  • 单链表—C语言实现数据结构

    本期带大家一起用C语言实现单链表🌈🌈🌈 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的;简单来说,线性表的链式存储结构生成的表,称作“链表”。 每个元素本身由两部分组成: 1、本身的信息,称为

    2024年02月07日
    浏览(64)
  • <数据结构> 链表 - 单链表(c语言实现)

    哨兵位结点也叫哑节点。哨兵位结点 也是头结点 。该节点 不存储有效数据,只是为了方便操作 (如尾插时用带哨兵位的头结点很爽,不需要判空)。 有哨兵位结点的链表,第一个元素应该是链表第二个节点(head - next,head为哨兵位结点)对应的元素。 有哨兵位结点的链表

    2023年04月11日
    浏览(27)
  • C语言:数据结构之单链表(三)

    上篇谈了谈尾插法和头插法,这篇谈谈中间插入元素和删除。 1、中间插入元素 既然谈到了要从中间插入那就得确定插入的位置是否合法了,我总不能链表总长为5,但是插入的位置是60,这就不对了。所以得先确定这个链表的长度为多少。这个比较简单,就是在寻找尾部的过

    2024年02月13日
    浏览(32)
  • C语言:数据结构之单链表(四)

    本篇谈一谈单链表的 改 ,具体操作就是找到他,然后修改元素即可,上一篇有相关代码,可以参考。 改函数代码如下: main函数如下:(修改第6,8,3位) 结果如下:   至此,单链表的增删改查就谈完了,只需理解它的本质是干什么,代码就很好写了。 总结:①改比较简单,

    2024年02月16日
    浏览(29)
  • C语言:数据结构之单链表(一)

    当初刚开始学单链表学的是一头雾水,简直就是彻头彻尾灾难,一塌糊涂,过段时间后经过自己的重新认真思考再结合小练习明白了它是怎么个回事儿。 1、首先从它的逻辑上入手,对他有大体认知。 简单来说就是一个一个有方向小块儿连在一起,好像疫情期间大家排队做核

    2024年02月12日
    浏览(67)
  • C语言:数据结构之单链表(二)

    上一篇随笔谈了谈单链表是什么东西,然后进行了初始化,这篇随笔就开始对其进行操作了,首先是增,删,改,查的增。 增,顾名思义就是要增加新的元素,单链表是链式的,那就要考虑怎么去加新元素,有三种,从头部添加,从尾部添加,从中间添加。先说说从尾部添加

    2024年02月12日
    浏览(29)
  • 【数据结构】—C语言实现单链表(超详细!)

                                         食用指南:本文在有C基础的情况下食用更佳                                     🔥 这就不得不推荐此专栏了:   C语言                                      ♈️ 今日夜电波:  あなたは煙草

    2024年02月14日
    浏览(34)
  • 数据结构:单链表的实现(C语言)

    个人主页 : 水月梦镜花 个人专栏 : 《C语言》 《数据结构》 本博客将要实现的无头单向不循环链表。 我们将节点定义为如下结构: 其成员变量有data,next。 将int重命名为STLDataType,方便我们以后修改数据域的内容。 动态申明一个空间,来放置数据。如下: 将data的内容置

    2024年02月14日
    浏览(35)
  • 【数据结构】C语言实现单链表(带头结点)

    Single linked list with leading nodes 关于不带头结点的单链表:不带头结点的单链表 结点定义: 接口定义: 初始化需要申请头结点,让头指针指向空的头结点。 将申请结点的代码进行封装: 需要越过头结点 找到尾结点,然后插入到尾结点的后面。 对比不带头结点的单链表的尾插

    2024年02月02日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包