又见链表 --- 另一种Creat方式与反转
链表
作为一种数据结构,链表以其方便的增删查改功能,实现了无数经典有用的程序。
在之前的帖子里,我构建链表的方式是建立一个不储存数据的head节点,然后通过一边输入数据一边建立结点的方式构建整个链表。
与之前不同的是,这里建立的是包含数据的头结点head:
下面是代码,包含创建部分,输出部分,删除部分,和插入部分。
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);
}
样例:

链表的反转
我这里采用的方法是 改变两个结点间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;//返回反转链表头指针。
}
大概的一个流程图(反转第一个结点)

注:红色箭头代表pPrev,pNext和pNow的移动,蓝色代表next指针的指向。
又见链表 --- 另一种Creat方式与反转的更多相关文章
- Android中BroadcastReceiver的两种注册方式(静态和动态)详解
今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...
- 通过三个DEMO学会SignalR的三种实现方式
一.理解SignalR ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信(即:客户端(Web页面)和服务器端可以互相实时的通知消息 ...
- (转)WCF开发框架形成之旅---WCF的几种寄宿方式
WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便.高效提供服务调用.本文分别对这几种方式进行详 ...
- Python模块常用的几种安装方式
Python模块安装方法 一.方法1: 单文件模块直接把文件拷贝到 $python_dir/Lib 二.方法2: 多文件模块,带setup.py 下载模块包,进行解压,进入模块文件夹,执行:pytho ...
- php 递归函数的三种实现方式
递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去.实现递归函数可以采取什么方式呢?本文列出了三种基本方式.理解其原来需要一定的基础知识 ...
- Android数据的四种存储方式
作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File. ...
- Android开发_Android数据的四种存储方式
Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放 ...
- MyEclipse中web服务器的三种配置方式
初学Javaweb开发的人们都会遇到一个问题,就是服务器环境的搭建配置问题.下面介绍三种服务器的搭建方式. 直接修改server.xml文件 当你写了一个web应用程序(jsp/servlet),想通 ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite
SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...
随机推荐
- mysql查看和修改注释
MySQL查看注释,MySQL修改注释,mysql查看注释,mysql修改注释 1.给大家做演示,这里随便创建一张学生表,代码如下: CREATE TABLE `student` ( `id` int ...
- 实习培训——Servlet(7)
实习培训——Servlet(7) 1 Servlet 异常处理 当一个 Servlet 抛出一个异常时,Web 容器在使用了 exception-type 元素的 web.xml 中搜索与抛出异常类 ...
- PAT 1064 Complete Binary Search Tree[二叉树][难]
1064 Complete Binary Search Tree (30)(30 分) A Binary Search Tree (BST) is recursively defined as a b ...
- unity3d-Visual Studio Tools for Unity快捷键
1.首先 当安装for unity 后,打开vs2013(我使用的是vs2013),右键可以看到for unity 提供了两个快捷键 2.其次 (Ctrl+Shift+M) 3.最后(Ctrl+Shi ...
- CSS兼容IE Firefox问题与解决方法
一.双边距问题浮动元素的外边距会加倍,但与第一个浮动元素相邻的其他浮动元素外边距不会加倍.解决方法:在此浮动元素增加样式 display:inline; 二.图片产生的间隙父元素直接包含<im ...
- 问题排查之'org.apache.rocketmq.spring.starter.core.RocketMQTemplate' that could not be found.- Bean method 'rocketMQTemplate' in 'RocketMQAutoConfiguration' not loaded.
背景 今天将一个SpringBoot项目的配置参数从原有的.yml文件迁移到Apollo后,启动报错“Bean method 'rocketMQTemplate' in 'RocketMQAutoCo ...
- Object-C-系统类型对象归档
系统类型主要是指NSString NSDictionary,NSArray,NSData,NSNumber 类型数据(包括对应可变类型); 这些类型已经实现了NSCoding协议,支持归档, 写入方法 ...
- python sys.stdin、sys.stdout和sys.stderr
学习并转载自 https://www.cnblogs.com/guyuyuan/p/6885448.html 标准输入:一般是键盘.stdin对象为解释器提供输入字符流,一般使用raw_input( ...
- postman接口测试——笔记
接口测试理论: 一.接口 1.程序内部接口:方法与方法之间,模块与模块之间的交互,程序内部抛出的接口,比如bbs系统,有登录模块,发帖模块等等,那你要发帖就必须先登录,那么这两个模块就得有交互,它 ...
- Nginx 灰度实现方式(支持纯灰度,纯生产,50度灰及更多比例配置)
前言 Nginx相关技术短信本篇幅不做详细介绍,所以学习本文之前要对Nginx有相关的了解. 生产环境即线上环境,在经历开发.测试再到上线,不可避免的会更新生产环境,但谁又能保证测试过的代码到线上运行 ...
