又见链表 --- 另一种Creat方式与反转

链表

作为一种数据结构,链表以其方便的增删查改功能,实现了无数经典有用的程序。
在之前的帖子里,我构建链表的方式是建立一个不储存数据的head节点,然后通过一边输入数据一边建立结点的方式构建整个链表。
与之前不同的是,这里建立的是包含数据的头结点head:
885822-20160517212423216-193225814.png

下面是代码,包含创建部分,输出部分,删除部分,和插入部分。

struct Node
{int data;Node *next;
};int n = 0; // 结点数 //=============Node_Creat==============//
Node *Node_Creat()
{Node *head = NULL; // 头指针置NULL Node *p1,*p2; // 开辟一个Node大小的空间 使p1和p2指向该空间 p1 = p2 = (Node *)malloc(sizeof(Node));if(p1 == NULL || p2 == NULL){printf("Overflow\n");exit(1);}scanf("%d",&p1 -> data); while(p1 -> data >= 0){n++;if(head == NULL){head = p1;} else{p2 -> next = p1;}p2 = p1;p1 = (Node *)malloc(sizeof(Node));if(p1 == NULL){printf("Overflow\n");exit(1);}scanf("%d",&p1 -> data);}p1 = NULL;p2 -> next = NULL;return head;
}//============Node_Print==============//
void Node_Print(Node *head)
{Node *p = head;if(head == NULL) // 链表为空 {printf("Empty!\n");return ;}else{printf("Total: %d Node\n",n);while(p != NULL){printf("%d ",p -> data);p = p -> next; }printf("\n");}
}//==============Node_Delete()===============//
void Node_Delete(Node *head,int num)
{Node *p1,*p2;p1 = head;if(p1 == NULL) // 链表为空{printf("Empty\n");return ;} if(num > n) // 结点不存在 {printf("Not Found!\n");return ;}n--; // 结点数-1 int i;for(i = 1; i < num; i++){if(p1 -> next == NULL)break;p2 = p1;p1 = p1 -> next;}if(p1 == head) // 头节点 即第一个{head = p1 -> next;}else{p2 -> next = p1 -> next;free(p1);}Node_Print(head);
}//============Node_Insert()============//
void Node_Insert(Node* head,int num,int i_data)
{Node * newNode;newNode = (Node *)malloc(sizeof(Node));if(newNode == NULL){printf("Overflow\n");exit(1);}newNode -> data = i_data;newNode -> next = NULL;Node *p1,*p2;p1 = head;for(int i = 1 ;i < num; i++){p2 = p1;p1 = p1 -> next;}p2 -> next = newNode;newNode -> next = p1;n++; // 结点数+1 Node_Print(head);
}

样例:

885822-20160517212743591-1336291725.png

链表的反转

我这里采用的方法是 改变两个结点间next指针的指向,原结点next指针指向下一个结点,反转后指向前一个结点。

Node* Node_Reverse(Node* head)
{Node* pNow = head;//当前结点Node* pPrv = NULL;//当前结点的前一个结点Node* pReversedHead = NULL;//反转链表头结点Node* pNext = NULL;//当前结点的下一个结点while(pNow != NULL){pNext = pNow -> next;if(pNext == NULL)//如果当前结点的下一个结点为空,那么反转链表的头结点就是当前结点。pReversedHead = pNow;pNow -> next = pPrv;//当前结点指向前一个结点pPrv = pNow;//pPrv和pNow往前移动。pNow = pNext;//这里要使用前面保存下来的pNext,不能使用pNow->next}return pReversedHead;//返回反转链表头指针。
}

大概的一个流程图(反转第一个结点)

885822-20160518165527388-1882302974.png

注:红色箭头代表pPrev,pNext和pNow的移动,蓝色代表next指针的指向。

转载于:https://www.cnblogs.com/qq952693358/p/5503244.html

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

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

相关文章

现在抖音这么火,那么你知道如何用CSS实现抖音字体?

比如这种抖音字体是不是感觉很酷,它是如何实现的呢,下面孙叫兽就简单分享一下CSS的实现方法,记得点赞收藏。 老司机给大家的一些小建议,一定要敲代码敲代码敲代码(重要的事情说三遍),程序员是实战家,不是思想家和理论家,程序员都是工兵,这个排雷的经验很重要。 实现这…

史上最全关于苹果开发者账号及上架APPStore总结

很多人如果开发这种移动应用APP,上架到到APPStore难免会遇到一系列的问题,这里孙叫兽进行总结一下,如果本文对你有帮助,记得转发点赞收藏。 一: 开发者账号的介绍 1 个人开发者账号 申请费用: 99美元/年 介绍:一般由iOS开发者个人申请,上架开发者自己的APP作品到苹果商…

EK算法应用,构图(POJ1149)

题目链接&#xff1a;http://poj.org/problem?id1149 题意中有一点要注意&#xff0c;否则构图就会有问题&#xff0c;每个顾客走后&#xff0c;被打开过的那些猪圈中的猪都可以被任意的调换到其他开着的猪圈中。 这里的构图不是单一的相邻&#xff0c;以及容量了&#xff0c;…

平台代码检查工具:sonarLint+sonarqube安装教程

加强对代码质量的管控要求&#xff0c;不允许新增代码部分出现严重、重要、主要等sonar扫描问题。 大家按以下文档安装开发工具对应的代码检测插件&#xff0c;请大家务必重视、执行.这里只介绍前端开发VSCode,后端开发Eclipse,两种代表性的编译器安装sonarLintsonarqube方法,其…

程序员通过CSDN如何获取收益

大家好,我是孙叫兽 ,本期内容给大家分享如何使用CSDN一边学习,一遍赚取收益,这样学习的时候也会产生动力. 废话不多说,直接看近7天收益. 博主如何赚取收益 对于博主这些创作者来说,收益主要有付费专栏,VIP文章收益,活动收益,红包收益,问答收益,打赏收益,付费资源收益,下载VIP分…

《Windows驱动开发技术详解》之编程加载NT式驱动

之前我们加载驱动都是利用INSTDRV这个应用&#xff0c;其原理是在注册表中写入相应的字段&#xff0c;这一节我们手动编写代码去加载驱动&#xff0c;其原理类似&#xff1a; 设备驱动程序的动态加载主要由服务控制管理程序&#xff08;Service Control Manager,SCM&#xff09…

程序员如何快速成长为IT精英

很多程序员工作了很多年,仍然只学到了皮毛点的业务和技术,技术长时间没有提升,一直拖拖拉拉处于某个水平,没有接触到核心业务,也难于成为公司的中流砥柱和骨干。那么程序员该如何成长呢? 1.主动学习 时刻保持危机感,对知识保持好奇心,完善自己的职业规划和知识体系,掌…

JavaFX实际应用程序:AISO HRC-Matic

“ Real-World JavaFX Apps”系列中的第三个应用程序是一种重型数据输入应用程序&#xff0c;由称为HRC-Matic的关系数据库支持。 它是由AISO在日内瓦开发的。 AISO是一家专门开发基于JavaFX的业务应用程序的公司。 他们还在研究我在本系列的第一个博客&#xff08; 欧洲广播联…

Feather包实现数据框快速读写,你值得拥有

什么是Feather&#xff1f; Feature是一种文件格式&#xff0c;支持R语言和Python的交互式存储&#xff0c;速度更快。目前支持R语言的data.frame和Python pandas 的DataFrame。 Feather收到了Apache arrow 项目的支持&#xff0c;Apache Arrow是Apache基金会下一个全新的开源项…

一文教你学会需求分析与管理

大家好,我是孙叫兽,本期给大家分享需求分析与管理,在项目开始或者需求整理时,这方面的知识显得尤为重要,常言道:良好的开始是成功的一半! 1.需求的定义 产品需求是在一定的时期,一定的场景中,无论是心理上还是生理上的,用户有着某种“需要”,这种“需要”用户自己不…

java 编写代码_Java 7:如何编写非常快速的Java代码

java 编写代码当我第一次写此博客时&#xff0c;我的目的是向您介绍ThreadLocalRandom类&#xff0c;它是Java 7中新增的用于生成随机数的类。 我在一系列微基准测试中分析了ThreadLocalRandom的性能&#xff0c;以了解其在单线程环境中的性能。 结果相对令人惊讶&#xff1a;尽…

POJ 1172 DFS

&#xff08;感谢wzc学长的幻灯片&#xff09; 单组数据 注意从必经点能到标记过的点则此点不是分裂点。 //By: Sirius_Ren #include <cstdio> #include <queue> #include <cstring> using namespace std; int tot1,first[51],cnt,v[101],nxt[101],n,vis[51…

远程桌面在自己电脑显示很小的解决办法

背景:最近在某银行办公,使用的是云桌面,疫情期间有一周是在加班办公,使用自己的电脑登录云桌面,然后电脑屏幕显示云桌面很小,看文档及代码十分难受。问问同事,这个问题终于得到了解决。 显示如下: 这个云桌面在我电脑就显示2/3宽度的大小,看代码太难受了,排除右上角向…

《JavaScript100例|01》之javaScript实现俄罗斯方块,唤起了女朋友儿时的回忆!

导读&#xff1a;小时候我们经常打游戏玩俄罗斯方块&#xff0c;用的是游戏机。 现在我们学会了敲代码&#xff0c;简单用JS实现一下这个游戏把。 目录 先看效果 操作说明 代码实现 完整代码 先看效果 操作说明 打开编译器&#xff0c;讲代码复制进去&#xff0c;在浏览…

adf4351使用_ADF:将UI类别与动态表单一起使用

adf4351使用JDev 11g R2具有有趣的新功能“ UI类别”。 它使我们可以在视图对象定义级别上以声明方式对VO的属性进行分组。 例如&#xff0c;我的VEmployees视图对象的“ UI Categories”选项卡如下所示&#xff1a; 默认情况下&#xff0c;每个视图对象都有一个预定义的类别“…

使用JavaScript将小写金额转化为大写金额的两种常见方法

导读:在一些支付或者银行确认信息中经常需要将小写金额转换为大写金额,这里做一下归纳, 目录 效果图: 方法一:使用正则表达式 方法二:常规JavaScript实现 效果图: 前面小写,后面大写,这里使用vue测试,其它框架同理.小写是传值的字段money,大写直接调用函数dealBigMoney(money…

h5-列表

<header> <!-- a,div,header,span {-webkit-tap-highlight-color: rgba(255, 255, 255, 0); /*修改a、input和button点击时的蓝色外边框和灰色半透明背景*/ } --><div class"header"> <!-- .header {height: 44px;background: #ff8200;position…

什么是突变测试?

最近&#xff0c;我反复提到“ 突变测试 ”一词。 因为可以说这种方法能够以超出代码覆盖范围的方式检测测试安全网的空白&#xff0c;所以我花了一些时间来追赶这个话题&#xff0c;然后尝试一下。 这篇文章总结了我的发现&#xff0c;作为对该主题的快速介绍。 什么是变异测…

JavaScript数组常用的方法总结

导读&#xff1a;在实际开发中&#xff0c;前端工程师除了写页面布局及样式还要对后端返回的数据进行处理&#xff0c;返回的数据大多数是json格式&#xff0c;一般都是返回一个对象或者数组&#xff0c;下面对常用的数组的使用方法进行总结&#xff0c;方便在开发中手到擒来&a…

Python黑魔法,一行实现并行化

Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题&#xff0c;例如线程的实现和 GIL&#xff0c;我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏“重”。而且往往隔靴搔痒&#xff0c;没有深入探讨日常工作中最有用的内容。 传统…