【数据结构与算法分析】反转链表与顺序表(内含源码,思路清晰)

news2024/11/16 3:38:23

文章目录

  • 介绍
  • 实现顺序表反转
  • 实现链表反转
  • 附链表的一些中间函数

介绍

  顺序表和链表都是数据结构中常见的线性表。它们的主要区别在于内存管理方式不同
  顺序表(Array)是由一系列元素按照一定顺序依次排列而成,它使用连续的内存空间存储数据。顺序表使用一个数组来存储数据,数组中的每个元素都可以通过下标来访问。顺序表具有随机访问、空间利用率高等优点,但在插入和删除元素时需要移动其他元素,导致效率低下。在需要频繁修改元素的情况下,顺序表不适合使用。
  链表(List)是一种通过指针来实现的动态数据结构,可以无序存储任意类型的数据。链表中的元素被称为节点,每个节点中都包含了数据和指向下一个节点的指针。相比之下,链表的内存分配是动态的,并且不需要提前规划数组大小,能够有效地避免内存浪费。链表可以快速地插入和删除节点,但是由于插入和删除必须先定位到指定位置,因此其访问时间比顺序表长。
  总之,当需要频繁查询顺序、频繁访问内部元素和使用预定义的固定大小存储数据时,使用顺序表可能是比较合适的选择。但当需要大量插入、删除和更改元素和无法提前预测空间大小时,链表的动态分配方式更为有效。

实现顺序表反转

/***************************************
* 函数功能:逆置顺序表
* 函数参数:int*data-表示待逆置的顺序表 int size-表示顺序表的大小
* 函数返回值:无
****************************************/
void reverse(int*data, int size)
{
	for (int i = 0; i < size / 2; ++i)
	{
		int temp = data[i];
		data[i] = data[size - i - 1];
		data[size - i - 1] = temp;
	}
}

  在函数体中,发生了一次 for 循环,该循环的次数与数据规模 N 成线性关系。另外,for 循环中进行了常数次的赋值操作。因此,整个函数的时间复杂度是 O(N)。(其中N表示顺序表的长度)
  该函数的空间复杂度为 O(1)(常数级别)。在函数执行期间,只使用了恒定数量的变量(i、temp),而且使用的空间不随问题规模 N 的增加而增加,因此该函数的空间复杂度为 O(1)。
  因此,该函数的时间复杂度为 O(N),空间复杂度为 O(1)。

实现链表反转

核心代码

/***************************************
* 函数功能:逆置链表
* 函数参数:struct myHead* list待逆置链表
* 函数返回值:无
****************************************/
void reverseList(struct myHead* list)
{
	struct myNode*p = list->element->next,*q = NULL;
	// 遍历链表
	while (p)
	{
		// 保存p的后继节点
		struct myNode*temp = p->next;
		// 改变指针指向的位置
		p->next = q;
		q = p;
		p = temp;
	}
	// 保存反转链表的结果
	list->element->next = q;
}

  算法的核心设计思想:改变链表中节点指针指向的位置,也就是改变前驱与后继元素的位置。
  若链表中的元素为1、2、3、4、5那么反转的过程图如下:
在这里插入图片描述

  该函数主要有两个操作:遍历链表和反转链表。在遍历链表过程中,需要访问、操作每个节点以及节点中存储的数据。因此,函数的时间复杂度为 O(N)。(其中 N 表示链表长度)
  函数的空间复杂度为 O(1)。函数只使用了常数级别的额外空间来存储一些临时变量,而且这些变量的空间占用与问题规模 N 无关,因此可以认为函数的空间复杂度为 O(1)。

附链表的一些中间函数

  链表的结构

struct myNode
{
	int data;
	struct myNode*next;
};

struct myHead
{
	int size;
	struct myNode*element;
};

  链表的一些基本操作,包括初始化、添加节点与输出链表。


/***************************************
* 函数功能:链表初始化
* 函数参数:无
* 函数返回值:无
****************************************/ 
struct myHead*listInit(void)
{
	// 初始化头结点
	struct myHead*myList = (struct myHead*)malloc(sizeof(struct myHead));
	myList->size = 0;
	// 添加虚拟节点
	myList->element = (struct myNode*)malloc(sizeof(struct myNode));
	myList->element->data = -1;
	myList->element->next = NULL;
	return myList;
}

/***************************************
* 函数功能:使用尾插法插入值至链表中
* 函数参数:struct myHead*list表示目标链表 int data表示待插入的值
* 函数返回值:无
****************************************/
void addNode(struct myHead*list, int data)
{
	struct myNode*p = list->element;
	// 遍历至待插入节点的前驱节点
	while (p->next)
		p = p->next;
	// 新建节点
	struct myNode*myNode = (struct myNode*)malloc(sizeof(struct myNode));
	myNode->data = data;
	myNode->next = NULL;
	// 插入节点并增加链表节点数量
	p->next = myNode;
	list->size++;
}

/***************************************
* 函数功能:输出链表
* 函数参数:struct myHead* list待输出链表
* 函数返回值:无
****************************************/
void outPutList(struct myHead* list)
{
	struct myNode *p = list->element->next;
	while (p)
	{
		printf("%d ",p->data);
		p = p->next;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】--单链表力扣面试题⑥链表的回文结构

题述&#xff1a;对于一个链表&#xff0c;请设计一个时间复杂度为o(n),额外空间复杂度为o(1)的算法&#xff0c;判断其是否为回文结构。给定一个链表的头指针A&#xff0c;请返回一个bool值&#xff0c;代表其是否为回文结构。保证链表长度<900 测试样例&#xff1a; 输入…

【统计分析】Bland-Altman图:MedCalc操作指南与Python实现

之前有记录过一致性分析中的天选之子ICC&#xff08;传送&#xff09;&#xff0c;也提到过Bland-Altman图&#xff0c;Bland-Altman图在一致性分析中作为一种既定量又定性的方法&#xff0c;还有着高颜值的表达展现&#xff0c;受到了广泛地应用。   如下图所示&#xff0c;…

Explaining predictive models: the Evidence Counterfactual

Imagine being targeted with an advertisement for this blog. You’d like to know: why did the AI model predict you’d be interested in the Faculty of Business and Economics’ blog, based on the hundreds of web pages you visited? The answer could be: becaus…

搭建ubuntu容器内C/C++开发调试环境

一、创建容器 为了让容器内的调试器&#xff08;gdb、lldb&#xff09;能够正常调试&#xff0c;在创建容器时需要添加参数&#xff1a; podman添加参数&#xff1a;--cap-addSYS_PTRACE&#xff0c;docker添加参数--cap-addSYS_PTRACE --security-opt seccompunconfined 否…

chatgpt赋能python:Python快捷键——另存为

Python快捷键——另存为 Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年创立。它的干净简洁&#xff0c;常规用途在计算机编程领域找到了广泛的应用。Python语言是一种普遍而有效的编程语言&#xff0c;有不少的Python程序员喜欢利用快捷键来提高编程效率。…

中医养生APP小程序开发 了解传统文化传承医学经典

中国文化博大精深&#xff0c;中国传统文化更是历史久远&#xff0c;一直到几千年后的今天很多传统文化依然对我们现在的生活有着重大的影响&#xff0c;比如中医。随着人们对健康关注度的提高&#xff0c;很多人把目光投向了追本溯源的中医上&#xff0c;企图通过中医养生达到…

搜索算法(四) 广度优先搜素算法

一、BFS bfs一层一层地遍历图或树&#xff0c;一般用队列实现&#xff0c;可以计算距离目标的步数。 二、例题 1&#xff09; 力扣https://leetcode.cn/problems/shortest-bridge/ 这道题实际是计算两个岛屿之间的最短距离&#xff0c;可以先用dfs搜索到第一个岛屿并且记录第…

TDEngine - taosdump的安装与使用实战

taosdump的安装与使用实战 一、taosdump简介二、下载三、安装四、taosdump主要参数五、taosdump数据导出&#xff08;备份&#xff09;六、taosdump数据导入七、不同版本的数据迁移7.1 问题&#xff1a;报错- create database 语句不一致7.2 解决&#xff1a;修改导出的dbs.sql…

MTK平台的SWT异常的简单总结(2)——SWT原理和分析

&#xff08;1&#xff09;原理性 &#xff08;2&#xff09;SWT如何抓取Log 遇到SWT问题详细可参考MTK提供的FAQ&#xff1a;SWT机制介绍。 获取Ap Log的路径&#xff1a;/sdcard/debuglogger/mobilelog/APLog_XXXXX 获取db的路径&#xff1a;/data/aee_exp 如果db没有打包…

RK3288 Android5.1添加WiFiBT模块AP6212

CPU&#xff1a;RK3288 系统&#xff1a;Android 5.1 注&#xff1a;RK3288系统&#xff0c;目前 Android 5.0 Kernel 3.10 SDK 支持 Braodcom,Realtek 等 WiFi BT 模块 各个 WiFi BT 模块已经做到动态兼容&#xff0c;Android 上层不再需要像以前一样进 行特定宏的配置 此…

华为OD机试真题 Java 实现【关联子串】【2023Q1 100分】,附详细解题思路

一、题目描述 给定两个字符串str1和str2&#xff0c; str1进行排列组合只要有一个为str2的子串则认为str1是str2的关联子串&#xff0c; 请返回子串在str2的起始位置&#xff0c;若不是关联子串则返回-1。 二、输入描述 qwe dsgfasgfwe 三、输出描述 -1 四、解题思路 …

遇到大数据处理,你会怎么办?快来看一下位图和布隆过滤器(下)

目录 前文 一&#xff0c;为什么有布隆过滤器 二&#xff0c;什么是布隆过滤器 三&#xff0c;布隆过滤器的实现 四&#xff0c;布隆过滤器的优缺点 4.1 布隆过滤器的优点 4.2 布隆过滤器的缺点及其改进方式 4.2.1 查找误判及其改进方式分析 4.2.2 不能删除以及改进方式分…

【HTML】第 1 节 - HTML 初体验

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 。 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、HTML 概念 2.1、HTML 定义 2.2、标签语法 3、HTML 基本骨架 4、标签的关系 5、注释 6、总结 1、缘起 最近在学习微信小程…

程序员0基础转行大数据年薪25万,只因我做了这件事...

现在我在成都的一家企业做大数据架构师&#xff0c;一个月税前可以拿到20k&#xff0c;还有项目奖金&#xff0c;一年下来最少也能拿25万。生活和工作也都在有条不紊地运转&#xff0c;每天也会有新的挑战&#xff0c;这正是我想要的生活。 01 机械工程专业 但我决定转行互联…

SpringBoot自定义starter之接口日志输出

文章目录 前言文章主体1 项目全部源码2 项目结构介绍3 starter 的使用3.1 配置文件 application,yml的内容3.2 启动类3.3 控制器类 4 测试结果 结语 前言 本文灵感来源是一道面试题。 要求做一个可以复用的接口日志输出工具&#xff0c;在使用时引入依赖&#xff0c;即可使用。…

MySQL数据库 10.DCL操作

目录 &#x1f914; 前言&#xff1a; &#x1f914;DCL介绍&#xff1a; &#x1f914;1.DCL管理用户&#xff1a; 1.查询用户&#xff1a; 图示&#xff1a; 2.创建用户 示例1&#xff1a; 运行结果&#xff1a;​ 示例2&#xff1a; 运行结果&#xff1a;​ 3.修改…

算法修炼之筑基篇——筑基一层中期(解决01背包,完全背包,多重背包)

✨博主&#xff1a;命运之光​​​​​​ &#x1f984;专栏&#xff1a;算法修炼之练气篇​​​​​ &#x1f353;专栏&#xff1a;算法修炼之筑基篇 ✨博主的其他文章&#xff1a;点击进入博主的主页​​​​​​ 前言&#xff1a;学习了算法修炼之练气篇想必各位蒟蒻们的基…

安全——网络安全协议的引入

TCP/IP安全缺陷 信息泄露 概述 网络中投递的报文往往包含账号、口令等敏感信息&#xff0c;若这些信息泄露则是灾难性的后果。其中嗅探是一种常见而隐蔽的网络攻击手段。 嗅探 概述 问题&#xff1a;在共享式网络架构下&#xff0c;所有的数据都是以广播方式进行发送&…

程序员大专毕业,月薪2w是什么体验?

在这个数据驱动的时代&#xff0c;大数据行业的发展前景也非常广阔&#xff0c;我相信我的未来会越来越光明 01 开始学习 是迈向前方的第一步 我是三月&#xff0c;一个来自小城市的大专毕业生。现在在杭州一家公司做大数据开发工程师&#xff0c;目前薪资是20k*13。 我本身…

运维小白必学篇之基础篇第十三集:网络概述中继实验

网络概述中继实验 实验作业&#xff08;主机名为自己的名字&#xff09;&#xff1a; 1、搭建中继环境&#xff0c;要求如下&#xff1a; 网络要求&#xff1a; 内网&#xff1a;192.168.50.50 网关&#xff1a;192.168.50.254 192.168.60.254 外网&#xff1a;192.168.60.60 主…