构建有序链表,有序链表的归并,反转链表

本次将对于构建有序链表,有序链表的归并,反转链表,进行一一介绍和代码分享。

首先是一些链表中的基本的函数:

Node* creatList()
{Node* headNode = (Node*)malloc(sizeof(Node));assert(headNode);headNode->next = NULL;return headNode;
}Node* creatNode(Datatype data)
{Node* newNode = (Node*)malloc(sizeof(Node));assert(newNode);newNode->data = data;newNode->next = NULL;return newNode;
}void traverseList(Node* headNode)
{Node* posNode = headNode->next;while (posNode != NULL){printf("%d ", posNode->data);posNode = posNode->next;}
}

这里很基本,如果理解有困难,请从头学习链表。

以下是构建有序链表,也就是找到符合顺序的位置进行节点插入:

//构建有序链表:和构建顺序表一样,需要找到符合顺序的位置,然后插入元素
//核心是找到第一个比它大的节点,放到这个节点之前(双节点遍历)
void insertData(Node* headNode, Datatype data)
{Node* newNode = creatNode(data);Node* posNode = headNode->next;Node* preNode = headNode;//assert(posNode);//当前面节点的数据小于data的时候,继续向后走while (posNode!= NULL && posNode->data <= data){posNode = posNode->next;preNode = preNode->next;}//特殊的情况分析:(短路现象)//pos在第一个节点,第一个节点为空,那么说明只有表头,连接表头和newNodeif (posNode == NULL&&posNode == headNode->next){headNode->next= newNode;}//pos不在第一个节点,但是pos指向空,//pos指向最后一个节点的后面一个,也就是还有没有找到大于data的:// 说明没有大于data的节点,所以将data与最后连接即可else if (posNode == NULL && posNode != headNode->next){preNode->next = newNode;}//找到了位置,插入在pos的前面else{newNode->next = posNode;preNode->next = newNode;}
}

这个过程和顺序表的构建流程基本相同,比较简单,所以不做过多解释。

接下来是单链表的翻转:

void reverseList(Node* headNode)
{//对于1个表头,1个节点;1个表头,2个节点的链表不需要进行翻转if (headNode->next == NULL || headNode->next->next == NULL){return;}Node* posNode = headNode->next;Node* preNode = NULL;Node* sucNode = headNode->next->next;while (sucNode != NULL){//指向改变posNode->next = preNode;//整体向后移动preNode = posNode;posNode = sucNode;sucNode = sucNode->next;}//最后一步改变指向方向posNode->next = preNode;//将表头与完成反转的第一个节点相连接headNode->next = posNode;
}

以下是逐步的过程模拟:结合代码中的注释和过程一一对应更容易理解,其中preNode,sucNode分别是posNode的前驱和后继节点。

示例

假设我们有以下的单链表:

headNode -> 1 -> 2 -> 3 -> 4 -> NULL

我们希望反转后得到:

headNode -> 4 -> 3 -> 2 -> 1 -> NULL

分析执行过程

  1. 初始化指针:
    • posNode 指向第一个元素(1)。
    • preNode 为 NULL(因为没有前驱节点)。
    • sucNode 指向第二个元素(2)。
  2. 进入循环,当 sucNode 不为 NULL 时:
    • 改变 posNode(当前节点)的 next 指针,使其指向前驱节点 preNode
    • 更新 preNode 为当前的 posNode
    • 更新 posNode 为当前的 sucNode
    • 更新 sucNode 为 posNode 的下一个节点。

这个过程会一直持续到 sucNode 为 NULL,即到达链表的末尾。

  1. 在循环结束后,执行以下操作:
    • 将最后一个节点(posNode)的 next 指针指向 preNode
    • 将头节点的 next 指针指向反转后的第一个节点(posNode)。

最后,两个有序链表的归并:

//有序链表的归并:
void mergeList(Node* newHeadNode, Node* head1, Node* head2)
{Node* up = head1->next;Node* down = head2->next;Node* temp = newHeadNode;assert(up && down);while (up != NULL && down != NULL){if (up->data < down->data){temp->next= up;up = up->next;}else{temp->next = down;down = down->next;}temp = temp->next;}//up结尾,down没结尾if (up == NULL && down != NULL){temp->next = down;}//down结尾,up没结尾else if (up != NULL && down == NULL){temp->next = up;}//没有两个同时结尾的情况
}

示例和分析执行过程:

假设我们有以下两个有序链表:

head1: 1 -> 3 -> 5
head2: 2 -> 4 -> 6

调用 mergeList(newHeadNode, head1, head2); 后,我们希望得到以下合并后的链表:

newHeadNode -> 1 -> 2 -> 3 -> 4 -> 5 -> 6

执行过程:

  1. up 指向 1down 指向 2temp 指向 newHeadNode
  2. 因为 1 < 2,所以 temp->next = up;,然后 up 移动到 3temp 移动到 1
  3. 现在 up 指向 3down 指向 2
  4. 因为 2 < 3,所以 temp->next = down;,然后 down 移动到 4temp 移动到 2
  5. 重复这个过程,直到 up 或 down 为 NULL
  6. 在本例中,当 up 指向 5 且 down 指向 4 时,因为 4 < 5down 指向的节点会被插入到新链表中。
  7. 当 down 遍历到 NULL 时,up 还有节点 5 和 6。因此,将 up 指向的剩余链表直接连接到新链表的末尾。

对于链表的归并,代码虽然简单,但要理解其中的流程是极为关键的,本次的分享结束,希望对你有帮助。

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

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

相关文章

海信电视:中国游戏的影像“黑神话”

【潮汐商业评论/文】 《西游记》最后一难中&#xff0c;通天河老鼋回唐三藏“何时才能修成正果”&#xff0c;《黑神话&#xff1a;悟空》也曾面临这个拷问&#xff0c;如今海信电视与它正在共同回答这个命题。 自2020年发布预告片震动行业后&#xff0c;这部游戏就承载着太多…

Shader 渐变屏幕

渐变 前置工作&#xff0c;创建缓冲&#xff0c;对顶点着色器传递顶点数据 function main() {var canvas document.getElementById(webgl);var gl getWebGLContext(canvas);if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) returnvar n initVertexBuffers(gl); }fu…

HBM 发展史与前景(持续更新)

主页&#xff1a; 元存储博客 文章目录 前言1. JEDEC 规范2. HBM 发展历程3. HBM 应用场景4. HBM 市场前景5. 发展挑战 翻译自&#xff1a; https://namu.wiki/w/HBM 前言 NVIDIA H2 上的 HBM100e。 1. JEDEC 规范 2. HBM 发展历程 HBM技术曾被视为一种噱头&#xff0c;因为它…

PSAvatar:一种基于点的可变形形状模型,用于3D高斯溅射的实时头部化身创建

PSAvatar: A Point-based Morphable Shape Model for Real-Time Head Avatar Creation with 3D Gaussian Splatting PSAvatar&#xff1a;一种基于点的可变形形状模型&#xff0c;用于3D高斯溅射的实时头部化身创建 Zhongyuan Zhao1,2, Zhenyu Bao1,2, Qing Li1, Guoping Qiu3,…

工时管理软件全攻略,8大关键因素一网打尽!

工时管理往往与项目管理与人力资源结合起来&#xff0c;考察每位员工的绩效指标。可以说&#xff0c;工时管理软件至关重要。什么叫工时管理&#xff1f;考虑到工时管理软件的八个关键要素包含&#xff1a;功能、使用体验、集成能力、扩展性、成本效率、安全隐私、技术支持、用…

javaWeb项目-智慧餐厅点餐管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JavaScript Java…

【漏洞复现】泛微e-cology ProcessOverRequestByXml接口存在任意文件读取漏洞

漏洞描述 泛微e-cology依托全新的设计理念,全新的管理思想。 为中大型组织创建全新的高效协同办公环境。 智能语音办公,简化软件操作界面。 身份认证、电子签名、电子签章、数据存证让合同全程数字化。泛微e-cology ProcessOverRequestByXml接口存在任意文件读取漏洞 免责声…

虚拟机磁盘剩余空间不足

VMware 弹出提示&#xff1a; 对文件“E:\Virtual Machine\CentOS 7 1810 的克隆 (2)\CentOS 7 1810-cl1.vmdk”的操作失败。 如果该文件位于远程文件系统上&#xff0c;请确保网络连接以及该磁盘所在的服务器正常工作。如果该文件位于可移动介质中&#xff0c;请重新连接该介…

从零自制docker-11-【pivotRoot切换实现文件系统隔离】

文章目录 busyboxdocker run -d busybox topcontainerId(docker ps --filter "ancestorbusybox:latest"|grep -v IMAGE|awk {print $1})docker export -o busybox.tar $containerId or sudo docker export 09bbf421d93f > ./busybox.tar tar -xvf busybox.tar -C …

nvm下载的node没有npm

nvm下载的node没有npm 相信大家最近可能发现自己使用的nvm下载nodejs没有npm了。 会出现这种情况&#xff1a; C:\Users\89121>nvm install 15 Downloading node.js version 15.14.0 (64-bit)... Complete Downloading npm version 7.7.6... Download failed. Rolling Bac…

如何查找一篇英文文献的源代码?(论文中没有源代码链接时)如何查找一篇论文的实现代码从而复现论文?

有两个网址&#xff0c;从这两个网址里面能找到论文相关代码&#xff0c;但不确定是不是人家论文里的源代码&#xff0c;但是根据论文实在找不到的情况下&#xff0c;只能试试这两个网址了 1. https://paperswithcode.com/ 2. https://www.catalyzex.com/

【QT进阶】Qt Web混合编程之CMake VS2019编译并使用QCefView(图文并茂超详细版本)

往期回顾 【QT进阶】Qt Web混合编程之CEF、QCefView简单介绍-CSDN博客 【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用&#xff08;图文并茂超详细介绍&#xff09;-CSDN博客【QT进阶】Qt Web混合编程之QWebEngineView基本用法-CSDN博客【QT进阶】Qt Web混合编程之VS2019 C…

Geoserver的RESTful接口使用

概述 GeoServer提供了一个RESTful接口&#xff0c;客户端可以通过该接口获取有关实例的信息并进行配置更改。REST接口使用简单的HTTP调用&#xff0c;通过客户端就可以配置GeoServer&#xff0c;而无需使用Web管理接口。 Geoserver中的关系 工作区、数据源、图层、图层组以及…

随身WiFi真实测评推荐!格行vs新讯随身wifi对比,公认最好的随身WiFi格行随身wifi有什么优势?

在当前移动网络高度发达的时代&#xff0c;随身 WiFi 已成为人们出差、旅行等场景中不可或缺的工具。格行和新讯是目前比较受欢迎的无线随身wifi。本次评测将对比分析这两款产品的区别&#xff0c;做为随身WiFi推荐第一名的格行随身wifi到底有什么优势呢&#xff1f; 品牌对比&…

手写Java设计模式之工厂模式,附源码解读

工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 工厂模式属于创建型…

网络流问题详解

1. 网络最大流 1.1 容量网络和网络最大流 1.1.1 容量网络 设 G(V, E)是一个有向网络&#xff0c;在 V 中指定了一个顶点&#xff0c;称为源点&#xff08;记为 Vs&#xff09;&#xff0c;以及另一个顶点&#xff0c;称为汇点&#xff08;记为 Vt&#xff09;&#xff1b;对…

基于java+springboot+vue实现的校园一卡通系统(文末源码+Lw+ppt)23-26

摘 要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;校园一卡通利用计算机网络实现信息化管理&#xff0c;使整个校园一卡通管理的发展和服务水平有显著提升。 本文拟采用java技…

Aws Nat Gateway

要点 NAT网关要能访问外网&#xff0c;所以需要部署在有互联网网关的Public子网中。 关键&#xff1a; NAT网关创建是选择子网&#xff0c;一定要选择公有子网&#xff08;有互联网网关子网&#xff09; 特别注意&#xff1a; 新建nat网关的时候&#xff0c;选择的子网一定…

【C++】哈希结构

目录 一&#xff0c;哈希结构的认识 1-1&#xff0c;哈希思想 1-2&#xff0c;哈希函数 1-3&#xff0c;哈希冲突 1-3-1&#xff0c;闭散列 1-3-2&#xff0c;开散列 二&#xff0c;哈希结构的封装实现 2-1&#xff0c;闭散列封装实现 ​编辑 2-2&#xff0c;开散列封…

genetic algorithm

genetic algorithm 遗传算法