链表 迭代方式实现链表反转

 

 

#include <stdio.h>
#include <stdlib.h>
这两行是包含标准的输入输出库和动态内存分配库,以便你能够使用 printf、scanf 和 malloc 函数。

struct Node{//定义一个结构体类型 作为节点 
    int data;//存储整型数据 
    struct Node* next;//存储下一个节点的地址 
};

这里定义了一个结构体 Node,表示链表的节点。每个节点包含一个整型数据 data 和一个指向下一个节点的指针 next。

struct Node* Reverse(struct Node* head){
    struct Node *current,*next,*prev;
    /*指向节点的指针current,next,prev 
    存储当前节点的current   存储前一个节点的prev  */

这里定义了一个名为 Reverse 的函数,用于反转链表。函数接受一个指向链表头节点的指针作为参数,并返回反转后的链表头节点的指针。在函数内部,定义了三个指针变量 current、next 和 prev,用来遍历链表并记录当前节点、下一个节点和前一个节点的地址。
   

current=head;//current指针指向链表的头节点head
    prev=NULL;

将 current 指针指向链表的头节点 head,将 prev 初始化为空指针,表示当前节点的前一个节点为空。

  while(current!=NULL){//temp非空时 遍历链表 
        next = current->next ;//指针next指向当前节点的下一个节点 
        current->next = prev ;//当前节点的next指针指向前一个节点 
        prev = current;//prev指针指向当前节点
        current = next;//current指针指向下一个节点
    } 

在一个 while 循环中,遍历整个链表。在每一次循环中,先将 next 指针指向当前节点 current 的下一个节点,以便在修改当前节点的 next 指针时不丢失对下一个节点的引用。然后将当前节点的 next 指针指向前一个节点 prev,从而实现链表的反转。最后,更新 prev 为当前节点 current,current 更新为下一个节点 next。

  

 //head指针指向反转后的链表的头节点,并返回head指针
    head = prev;
    return head;
}循环结束后,将链表的头节点指针 head 更新为反转后的链表的头节点 prev,然后返回 head 指针。

Node*Insert(Node* head,int data){
    Node *temp = (struct Node*)malloc(sizeof(struct Node));
    temp->data = data;
    temp->next = NULL;

这是一个插入节点的函数 Insert,接受一个指向链表头节点的指针 head 和要插入的整数数据 data。函数首先动态分配一个新节点 temp,然后将新节点的数据域 data 设置为传入的数据,将新节点的指针域 next 设置为 NULL。

    if(head==NULL) head=temp;
    else {
        Node* temp1 = head;
        while(temp1->next !=NULL) temp1=temp1->next;
        temp1->next = temp;
    }
    return head;
}

接着,函数检查链表是否为空。如果链表为空,则将 head 指针指向新节点 temp。否则,遍历链表直到找到最后一个节点,然后将新节点连接到链表的末尾。

void Print(Node* head){
    while(head!=NULL){
       printf("%d ",head->data );
        head = head ->next;
    }
}

这是一个打印链表节点数据的函数 Print,接受一个指向链表头节点的指针 head。函数通过循环遍历链表,逐个打印每个节点的数据,并将指针移动到下一个节点。

int main(){
    struct Node* head=NULL;
    head=Insert(head,2);
    head=Insert(head,4);
    head=Insert(head,6);
    head=Insert(head,8);
    Print(head);
    head=Reverse(head);
    Print(head);
}

最后,在 main 函数中,你创建了一个空链表,然后依次插入了四个节点(2、4、6、8),然后调用 Print 函数打印原始链表。接着调用 Reverse 函数反转链表,再次调用 Print 函数打印反转后的链表。

//迭代方式实现链表反转
#include <stdio.h>
#include <stdlib.h>
struct Node{//定义一个结构体类型 作为节点 
	int data;//存储整型数据 
	struct Node* next;//存储下一个节点的地址 
};
 
struct Node* Reverse(struct Node* head){
	struct Node *current,*next,*prev;
	/*指向节点的指针current,next,prev 
	存储当前节点的current  
	存储下一个节点的next 
	存储前一个节点的prev  */
	 
	current=head;//current指针指向链表的头节点head
	prev=NULL;
	
	while(current!=NULL){//temp非空时 遍历链表 
		next = current->next ;//指针next指向当前节点的下一个节点 
		current->next = prev ;//当前节点的next指针指向前一个节点 
		prev = current;//prev指针指向当前节点
		current = next;//current指针指向下一个节点
	} 
	//head指针指向反转后的链表的头节点,并返回head指针
	head = prev;
	return head;
}

Node*Insert(Node* head,int data){
	Node *temp = (struct Node*)malloc(sizeof(struct Node));
	temp->data = data;
	temp->next = NULL;
	if(head==NULL) head=temp;
	else {
		Node* temp1 = head;
		while(temp1->next !=NULL) temp1=temp1->next;
		temp1->next = temp;
	}
	return head;
}

void Print(Node* head){
	while(head!=NULL){
		printf("%d ",head->data );
		head = head ->next;
	}
}

int main(){
	struct Node* head=NULL;
	head=Insert(head,2);
	head=Insert(head,4);
	head=Insert(head,6);
	head=Insert(head,8);
	Print(head);
	head=Reverse(head);
	Print(head);
	return 0;
}




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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java】继承与抽象(实验三)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 了解继承的概念&#xff0c;掌握派生类的定义。掌握派生类构造方法的执行过程。掌握方法的重载与覆盖。掌握抽象类的概念及上转型对象的使用 二、实验内容 1、定义一个抽象类Shape&#xff0c;类中封装属性name…

vscode 如何连接 WSL (不能通过 IP 地址连接)

来源&#xff1a;https://www.cnblogs.com/wxdblog/p/17234342.html vscode (remote-ssh) 连接 WSL 不能使用 IP地址 连接&#xff0c;需要安装 WSL 扩展才行

常用显示屏学习——LCD12864(含高级驱动程序)

LCD12864液晶显示屏 屏幕介绍 ① 可显示四行字符&#xff0c;每行可显示8个汉字或者16个数字和字母&#xff1b; ②可串行通信和并行通信&#xff1b; ③ 串口接口管脚信号 通信方法 &#xff08;一&#xff09;八位并行通信方法 &#xff08;二&#xff09;串行通信方法 用…

linux安装flink(单节点)

下载链接 https://downloads.apache.org/flink/flink-1.18.1/上传&#xff0c;解压&#xff0c;重命名&#xff0c;注意路径 tar -zxf /opt/flink-scala/flink-1.18.1-bin-scala_2.12.tgz -C /opt/flink-scala mv /opt/flink-scala/flink-1.18.1 /opt/flink-scala/flink环境变…

su模型在3d里渲染效果如何---模大狮模型网

SketchUp模型在其他3D应用程序中进行渲染可以获得非常好的效果&#xff0c;取决于您所选择的渲染引擎和技术水平。下面是一些常见的渲染效果和技巧&#xff1a; 一&#xff1a;光照和阴影 通过添加适当的光源和调整阴影设置&#xff0c;可以使SketchUp模型在渲染中呈现出更加真…

基于Python网络爬虫的IT招聘就业岗位可视化分析推荐系统

文章目录 基于Python网络爬虫的IT招聘就业岗位可视化分析推荐系统项目概述招聘岗位数据爬虫分析系统展示用户注册登录系统首页IT招聘数据开发岗-javaIT招聘数据开发岗-PythonIT招聘数据开发岗-AndroidIT招聘数据开发岗-其它招聘岗位数据分析算法方面运维方面测试方面招聘岗位薪…

【多线程】volatile 关键字、wait 和 notify方法详解

volatile 、wait 和 notify &#x1f332;volatile关键字&#x1f6a9;保证内存可见性&#x1f6a9;volatile 不保证原⼦性 &#x1f333;wait 和 notify方法&#x1f6a9;wait()&#x1f6a9;notify()&#x1f6a9;notifyAll()方法 ⭕wait 和 sleep 的对比&#xff08; 面试题…

机器学习基础(四)非监督学习的进阶探索

导语&#xff1a;上一节我们详细探索监督学习的进阶应用&#xff0c;详情可见&#xff1a; 机器学习基础&#xff08;三&#xff09;监督学习的进阶探索-CSDN博客文章浏览阅读296次&#xff0c;点赞13次&#xff0c;收藏11次。监督学习作为机器学习的一个主要分支&#xff0c;…

RHEL9安装Python2.7

RHEL9作为2022年5月新推出的版本&#xff0c;较RHEL8有了很多地方的改进&#xff0c;而且自带很多包&#xff0c;功能非常强大&#xff0c;稳定性和流畅度也较先前版本有了很大的提升。RHEL9自带python3.9&#xff0c;但是过高版本的python不可避免地会导致一些旧版本包地不兼容…

【分布式事务 XA模式】MySQL XA模式详解

MYSQL中的XA事务 写在前面1. XA事务的基本原理2. MySQL XA事务操作 写在前面 MySQL 的 5.0.3 版本开始支持XA分布式事务&#xff0c;并且只有innoDB存储引擎支持XA事务。 1. XA事务的基本原理 XA事务本质上是一种基于两阶段提交的分布式事务&#xff0c;分布式事务可以理解成…

一些PCB整改优化经验总结

一个UP的PCB整改经验&#xff1a; 当正面全局铺铜之后出现很多小铜皮碎片的时候不如不铺铜或者单面铺铜RJ45网口的地和整体的地分开&#xff0c;两地之间通过电容相连&#xff08;整板地一定要相连&#xff09;TVS这种防浪涌高压的器件的地单独铺设&#xff0c;这样当高压来临…

《艾尔登法环 黄金树幽影》是什么?Mac电脑怎么玩《艾尔登法环》艾尔登法环下载

全体起立&#xff0c;《艾尔登法环 》最新DLC《黄金树幽影》将在6月21日发布&#xff0c;steam售价198元&#xff0c;现在就可以预订了。宫崎英高在接受FAMI通的采访时表示&#xff0c;新DLC的体量远超《黑暗之魂》和《血源诅咒》资料片。好家伙&#xff0c;别人是把DLC续作&am…

踩坑:SpringBoot连接Mysql的时区报错

解决方法&#xff1a;1.修改时区2.修改连接版本 目录 1.修改时区 2.切换版本 1.修改时区 查看mysql的默认时区 SELECT global.time_zone AS Global Time Zone, session.time_zone AS Session Time Zone; 查看mysqk的默认是时区返回两个结果 Global Time Zone:表示Mysql…

Jenkins中Publish Over SSH插件使用(1)

SSH插件 前言Publish Over SSH插件是jenkins里面必不可少的插件之一&#xff0c;主要的功能有两个把jenkins服务器上的文件&#xff0c;传输到远程nginx&#xff0c; 远程执行shell命令和脚本。 1. SSH插件下载与配置 1.1 下载Publish over SSH插件 系统管理—》管理插件 …

可控核聚变新里程碑!AI成功预测等离子体撕裂登Nature,清洁能源「圣杯」更近一步

可控核聚变&#xff0c;又有新突破了&#xff01; 长期以来&#xff0c;核聚变一直受着一个「幽灵」的困扰——等离子体不稳定性问题。 而最近&#xff0c;普林斯顿团队用AI提前300毫秒预测了核聚变等离子不稳定态&#xff0c;这个时间&#xff0c;就足够约束磁场调整应对等离…

美团外卖流程解析:便捷、高效、安全的美食配送

美团外卖作为中国最大的外卖平台之一&#xff0c;提供了丰富多样的美食选择&#xff0c;并通过高效的配送服务将美食送到用户手中。本文将深入探讨美团外卖的流程&#xff0c;从下单到送达&#xff0c;揭秘背后的便捷、高效、安全的运营体系。 1. 下单与支付 美团外卖的下单过…

[每周一更]-(第88期):Nginx 之 proxy_pass使用详解

proxy_pass 指令用于指定后端服务器的地址&#xff0c;可以采用以下不同的格式&#xff1a; 直接指定地址和端口&#xff1a; location / {proxy_pass http://backend_server:8080; }这将请求代理到 http://backend_server:8080。 使用变量&#xff1a; location / {set $ba…

bat脚本检测进程程序的方法

一、脚本检测进程 使用批处理脚本检测程序是否在运行&#xff0c;可以使用tasklist命令来列出当前运行的所有进程&#xff0c;并通过findstr命令来搜索特定的进程名。下面是一个简单的批处理脚本示例&#xff0c;它会检测指定的程序是否在运行&#xff0c;并给出相应的信息&…

PostgreSQL索引篇 | BTree

B-Tree索引 &#xff08;本文为《PostgreSQL数据库内核分析》一书的总结笔记&#xff0c;需要电子版的可私信我&#xff09; B树特点&#xff1a; 非叶子节点含一个或多个关键字值和子节点指针&#xff0c;不指向实际数据的存储位置所有关键字都是叶子节点&#xff0c;每个叶…

echarts多y轴样式重叠问题

1、主要属性设置 yAxis: [{//y轴1nameTextStyle: {align: "right",padding: 0}},{//y轴2nameTextStyle: {align: "left",padding: 0}},{//y轴3axisLabel: {margin: 50},nameTextStyle: {align: "left",padding: [0, 0, 0, 50]},axisPointer: {l…