2.6 线性表的逆置

news2024/11/25 2:57:14

        逆置: 将表中的元素调整成与原来相反的顺序. 

1. 顺序表的逆置

 图1. 顺序表的逆置

        用temp存储要交换的元素, temp = arr[ i ]; arr[ i ] = arr[ j ]; arr[ j ] = temp; 然后i++, j--. 若数组长度为偶数, 则i > j时结束循环; 若数组长度为奇数, 则i >= j时结束循环. 也即不管数组的长度是奇数还是偶数, 均为i < j时执行循环, 否则跳出循环

#include <iostream>

/// <summary>
/// 数组最大长度
/// </summary>
const int MAX_SIZE = 10;

/// <summary>
/// 初始化数组
/// </summary>
/// <param name="arr">数组</param>
/// <param name="length">数组长度</param>
/// <returns></returns>
int initArr(int* arr, int length) {
	if (length > MAX_SIZE || length <= 0) {
		return 0;
	}
	for (int i = 0; i < length; i++)
	{
		arr[i] = i;
	}
	return 1;
}

/// <summary>
/// 数组逆置
/// </summary>
/// <param name="arr">数组</param>
/// <param name="length">数组长度</param>
/// <param name="left">逆置起始元素下标</param>
/// <param name="right">逆置终止元素下标</param>
/// <returns></returns>
int inversionArr(int* arr, int length, int left, int right) {
	if (length > MAX_SIZE || length <= 0) {	//length越界
		return 0;
	}
	if (left < 0 || left > length - 1) {	//起始元素下标越界
		return 0;
	}
	if (right < 0 || right > length - 1) {	//终止元素下标越界
		return 0;
	}
	if (left > right) {
		return 0;
	}

	//数组逆置核心代码
	for (int i = left, j = right; i < j; i++, j--)
	{
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
	return 1;
}

/// <summary>
/// 输出数组元素
/// </summary>
/// <param name="arr"></param>
/// <param name="length"></param>
void printArr(int* arr, int length) {
	for (int i = 0; i < length; i++)
	{
		printf("%d\n", arr[i]);
	}
}

int main()
{
	int arr[MAX_SIZE];		//这里[]里面的值必须是常量
	int length = 6;

	int result = initArr(arr, length);
	if (result == 1) {
		printf("逆置前的数组元素:\n");
		printArr(arr, length);
		int result2 = inversionArr(arr, length, 3, 3);
		if (result2 == 1) {
			printf("逆置后的数组元素:\n");
			printArr(arr, length);
		}
	}
	
}

代码1: 顺序表的逆置

//数组逆置核心代码
for (int i = left, j = right; i < j; i++, j--)
{
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

代码2: 顺序表的逆置核心代码

2. 链表的逆置

图2. 链表的逆置

        p指向逆置起始结点的前一个结点, q指向逆置终止结点, t 指向本次循环要逆置的结点. 每次循环时, 将p后面的结点从链表中取出, 放入q指向的结点的后面, 即可完成逆置操作. 

#include <iostream>

/// <summary>
/// 链表结点结构体定义
/// </summary>
typedef struct LNode {
	int data;
	struct LNode* next;
}LNode;

/// <summary>
/// 链表逆置
/// </summary>
/// <param name="p"></param>
/// <param name="q"></param>
void inversionLinkList(LNode* p, LNode* q) {
	if (p == q) {
		return;
	}

	//链表逆置核心代码
	while (p->next != q) {
		LNode* t = p->next;
		p->next = t->next;
		t->next = q->next;
		q->next = t;
	}
}

/// <summary>
/// 输出链表的值
/// </summary>
/// <param name="H"></param>
void printLinkList(LNode* H) {
	LNode* p = H;
	while (p != NULL)
	{
		if (p->data != 0) {
			printf("%d\n", p->data);
		}
		p = p->next;
	}
}

int main()
{
	LNode* H = (LNode*)malloc(sizeof(LNode));
	LNode* A = (LNode*)malloc(sizeof(LNode));
	LNode* B = (LNode*)malloc(sizeof(LNode));
	LNode* C = (LNode*)malloc(sizeof(LNode));
	LNode* D = (LNode*)malloc(sizeof(LNode));

	H->data = NULL;
	A->data = 1;
	B->data = 2;
	C->data = 3;
	D->data = 4;

	H->next = A;
	A->next = B;
	B->next = C;
	C->next = D;
	D->next = NULL;

	printf("逆置前的链表: \n");
	printLinkList(H);
	inversionLinkList(A, A);
	printf("逆置后的链表: \n");
	printLinkList(H);
}

代码3: 链表的逆置

//链表逆置核心代码
while (p->next != q) 
{
    LNode* t = p->next;
    p->next = t->next;
    t->next = q->next;
    q->next = t;
}

代码4: 链表的逆置核心代码

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

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

相关文章

ABAP W CVI_EI 047 对供应商,不支持初始的 OBJECT_TASK

调BAPI:cl_md_bp_maintain>maintain修改供应商失败&#xff0c;提示 W CVI_EI 047 对供应商&#xff0c;不支持初始的 OBJECT_TASK 很可能是vendor-header中的object_task没有赋值 ls_data-vendor-header-object_task ‘U’.

C进阶:指针的进阶(3)

函数指针 首先来看一段代码&#xff1a; #include <stdio.h>void test() {printf("hehe\n"); }int main() {printf("%p\n", test);printf("%p\n", &test);return 0; } 让我们来看一下执行结果吧&#xff1a; 从上述结果得出&#x…

OCR-字符识别笔记

安装 环境依赖 Linux | Windows | macOSPython 3.7PyTorch 1.6 或更高版本torchvision 0.7.0CUDA 10.1NCCL 2GCC 5.4.0 或更高版本准备环境 注解 如果你已经在本地安装了 PyTorch,请直接跳转到安装步骤。 第一步 下载并安装 Miniconda. 第二步 创建并激活一个 conda 环境…

[PCIE体系结构导读]PCI和PCI中断

PCI PCI总桥由HOST主桥和PCI桥推出&#xff0c;HOST主桥与主存储器控制器在同一级总线上&#xff0c;因此PCI设备可以方便地通过HOST主桥访问主存储器&#xff0c;即进行DMA操作。 PCI设备的DMA操作需要与处理器系统的Cache进行一致性操作&#xff0c;当PCI设备通过HOST主桥访…

guava限流器RateLimiter使用简介(Springboot实现)

在大型分布式系统中&#xff0c;限流是一种重要的防护机制&#xff0c;可以帮助我们控制流量并减轻系统的负担。Google的Guava库提供了一种方便的限流器实现&#xff0c;可以帮助我们轻松地实现限流功能。本文将介绍Guava中限流器的基本概念和使用方法。 一、什么是限流器&…

二层交换机和三层交换机区别

一、指代不同 1、两层交换机&#xff1a;工作于OSI模型的第2层&#xff08;数据链路层&#xff09;&#xff0c;故而称为二层交换机。 2、三层交换机&#xff1a;具有部分路由器功能的交换机&#xff0c;工作在OSI网络标准模型的第三层。 二、功能不同 1、两层交换机&#xff1…

企业数字化转型需要解决哪些问题?

企业的数字化转型及利用技术和数字解决方案来改进业务流程、增强客户体验并推动整体增长。尽管每个企业的数字化转型之旅都是独特的&#xff0c;但仍需要解决几个常见问题以确保转型成功。其中一些问题包括&#xff1a; 1.抵制变革&#xff1a;数字化转型中最大的挑战之一是员…

国赛线下开赛!全国智能车百度智慧交通创意组区域赛今日正式拉开帷幕!

“全国大学生智能汽车竞赛”是教育部倡导的大学生科技A类竞赛&#xff0c;中国高等教育学会将其列为含金量最高的大学生竞赛之一&#xff0c;为《全国普通高校大学生竞赛排行榜》榜单内赛事。飞桨共承办了百度完全模型组和百度智慧交通组两大赛道。全国大学生智能汽车竞赛百度智…

ptmalloc底层原理剖析

目录 一、概述 二、基础了解 2.1 32位进程默认内存布局 2.2 brk & sbrk & mmap 三、内存管理 2.1 结构 2.1.1 main_arena 与 non_main_arena 2.1.2 malloc_chunk 2.1.3 空闲链表bins 2.1.4 初始化 2.2 内存分配与释放 三、ptmalloc、tcmalloc与jemalloc实现…

阿里云安装宝塔面板

阿里云安装宝塔面板 1.安装步骤2.需要加入安全组&#xff0c;打开端口3.安装宝塔 1.安装步骤 1.这里主要以阿里云的服务器 ECS为例子,需要安装纯净的系统 创建过程: 这边先用的是免费的: 2.需要加入安全组&#xff0c;打开端口 进入实例选项卡&#xff1a; 快速添加&…

一种利用旋转中心进行手眼标定的原理性介绍

首先,我们要了解一下常规的手眼标定流程是怎么样的。 (一)如果吸嘴中心就是法兰盘的中心则 是下面这样的: 按九宫格走九个点,取得九组吸嘴的像素坐标与法兰盘的机械坐标 (图1) 进行标定 (二)如果吸嘴位置不在法兰盘中心 则标定流程要复杂些: …

Redis定时的值莫名其妙丢失了(被删除),问题记录

首先是有效期为三天的值&#xff0c;莫名其妙的时间就没了&#xff0c;无效了。登录查看所有Redis的key&#xff0c;如下 发现存在四个未知的key&#xff0c;backup1 2 3 4。百度后发现可能是由于没有修改默认端口号加上未设置连接密码&#xff0c;所以准备修改这两处改完后的登…

如何平衡薪酬水平和组织目标?

在组织中&#xff0c;薪酬水平是一个非常重要的因素&#xff0c;因为它涉及到员工的生活质量和组织的运营。然而&#xff0c;如何平衡薪酬水平和组织目标却是一个复杂的问题&#xff0c;需要考虑多个因素。 首先&#xff0c;组织的目标应该是明确的&#xff0c;这将有助于确定…

如何在Linux系统中安装ActiveMQ

1、环境 ActiveMQ是一个纯Java程序&#xff0c;这里安装5.18.2版ActiveMQ&#xff0c;该版MQ运行在JDK 11环境内&#xff0c;为此需要先搭建JDK 11环境&#xff0c;这里安装JDK 15。 1.1、卸载 卸载开源JDK软件包&#xff0c;如下所示&#xff1a; [rootlocalhost ~]# rpm -…

地理信息领域最佳摄影测量软件

摄影测量软件是想要构建对象或环境的3D模型的土地测量师、工程和法医团队的必备软件。 特别是如果你对练习测绘或测量感兴趣&#xff0c;摄影测量在两个不同有利位置的照片中使用视差和浮雕位移。 摄影测量软件不仅可以构建3D模型&#xff0c;还可以执行测量尺寸、构建虚拟原…

《Kubernetes入门实战课》课程学习笔记(一)

迎难而上&#xff0c;做云原生时代的弄潮儿 现在 Kubernetes 已经没有了实际意义上的竞争对手&#xff0c;它的地位就如同 Linux 一样&#xff0c;成为了事实上的云原生操作系统&#xff0c;是构建现代应用的基石。现代应用是什么&#xff1f; 是微服务&#xff0c;是服务网格…

聊聊Spring注解@Transactional失效的那些事 | 京东云技术团队

一、前言 emm&#xff0c;又又又踩坑啦。这次的需求主要是对逾期计算的需求任务进行优化&#xff0c;现有的计算任务运行时间太长了。简单描述下此次的问题&#xff1a;在项目中进行多个数据库执行操作时&#xff0c;我们期望的是将其整个封装成一个事务&#xff0c;要么全部成…

Spring源码学习-后置处理器,Autowired实现原理

目录 Autowired实现原理populateBeanInstantiationAwareBeanPostProcessorAutowiredAnnotationBeanPostProcessor 后置处理器BeanFactory的后置处理器BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessoConfigurationClassPostProcessor Bean的后置处理器BeanProcess…

2020年国赛高教杯数学建模D题接触式轮廓仪的自动标注解题全过程文档及程序

2020年国赛高教杯数学建模 D题 接触式轮廓仪的自动标注 原题再现 轮廓仪是一种两坐标测量仪器&#xff08;见图1&#xff09;&#xff0c;它由工作平台、夹具、被测工件、探针、传感器和伺服驱动等部件组成&#xff08;见图2&#xff09;。   接触式轮廓仪的工作原理是&am…

antd-React Table 中文转化

1.首先需要进行中文包导入 2.引入标签对Table进行包裹即可 import zh_CN from antd/lib/locale-provider/zh_CN;import {ConfigProvider} from antd;<ConfigProvider locale{zh_CN}><Tablecolumns{columns}rowKey{record > record.id}dataSource{data}pagination{p…