单链表的操作(创建、查找、插入、删除、遍历、就地逆转等)

2023-05-16

先贴原代码,后面再一一做解释。


/* 单链表的各创建等等操作

日期:2017年11月3日 21:46
*/

#include "stdafx.h"
#include <iostream>
#include "stdlib.h"
using namespace std;

//定义链表结点
typedef struct node
{
	int data;
	node * next;
}node;
/* 
创建单链表
思路:head结点,while循环输入结点,可以做个改进,head结点的data为链表的长度
日期:2017年11月3日 21:46
*/
node * create()
{
	int i = 0;
	node *head, *p, *q=NULL;
	int x = 0;
	head = new node();

	while (true)
	{
		printf("input node data:");
		scanf("%d", &x);
		if (x==0)
		{
			break;
		}
		p = new node();
		p->data = x;
		if (++i == 1)
		{
			head->next = p;
		}
		else
		{
			q->next = p;
		}
		q = p;
	}
	q->next = NULL;
	return head;
}

/*
测单链表长度
head->next 为第一个结点,循环遍历到尾结点,为空的结点为止
日期:2017年11月3日 21:53
*/
int Length(node * head)
{
	if (head == NULL)
	{
		return 0;
	}
	int len = 0;
	node *p;
	p = head->next;
	while (p != NULL)
	{
		len++;
		p = p->next;
	}
	return len;

}
/*
单链表打印

日期:2017年11月3日 21:53
*/
int Print(node * head)
{	
	int index = 0;
	node *p;
	if (head->next == NULL)
	{
		printf("link is null\n");
		return 0;
	}
	p = head->next;
	while (p != NULL)
	{
		printf ("the %dth node is %d\n", ++index, p->data);
		p = p->next;
	}
	return index;
}
/*
单链表查找(以节点数来查找,而不是以关键字来查找)

日期:2017年11月3日 21:58
*/
node * search(node*head, int pos)
{
	node *p = head->next;
	if (pos<0)
	{
		printf("incorrect position to search node!\n");
		return NULL;
	}
	if (pos == 0)
	{
		return head;
	}
	if (p == NULL)
	{
		printf("link is empty!\n");
		return NULL;
	}
	while (pos--)
	{
		if ((p=p->next)==NULL)
		{
			printf("incorrect position to search node!\n");
			break;
		}
	}
	return p;
}
/*
单链表插入节点

日期:2017年11月3日 22:10
*/
node *insert_node(node* head, int pos, int data)
{
	node * item = NULL;
	node *p;
	item = new node();
	item->data = data;
	if (pos ==0)
	{
		head->next = item;
		return head;
	}
	p = search(head, pos-1);

	//在p 与p->next中插入节点item
	//很简单  
	if (p!=NULL)
	{
		item->next = p->next;
		p->next = item;
	}
	return head;
}

/*
单链表删除节点

日期:2017年11月3日 22:10
*/
node *delete_node(node* head, int pos)
{
	node * item = NULL;
	node *p = head->next;
	
	if (p == NULL)
	{
		printf("link is empty!\n");
		return NULL;
	}
	p = search(head, pos-1);

	if (p!=NULL&&p->next!=NULL)
	{
		item = p->next;
		p->next = item->next;
		delete item;
	}
	return head;
}

/*
单链表逆转:就地逆转

日期:2017年11月3日 22:10
*/

node * reverse(node * head)
{
	node *p, *q, *r;
	//空值判断
	if (head->next == NULL)
	{
		return NULL;
	}
	p = head->next;
	q = p->next;
	p->next = NULL;
	while (q!=NULL)
	{
		r = q->next;
		q->next = p;
		p = q;
		q = r;
	}
	head->next = p;
	return head;
}

/*
查找单链表的中间元素
i走两步,j走一步……,由此来判断中间的元素
日期:2017年11月3日 22:10
*/
node * searchMidNode(node * head)
{
	int i = 0;
	int  j = 0;
	node * current = NULL;
	node * middle = NULL;

	current = middle = head->next;
	while (current!=NULL) 
	{
		if (i/2>j)
		{
			j++;
			middle = middle->next;
		}
		i++;
		current = current->next;
	}
	return middle;
}


int main()
{
	node *head = create();
	printf("------------origin list----------------------\n");
	Print(head);
	printf("len:%d\n", Length(head));
	printf("------------end origin ----------------------\n\n");

	printf("------------insert list----------------------\n");
	head = insert_node(head, 2, 5);
	printf("insert int 5 after 2th node :\n");
	Print(head);
	printf("------------end insert ----------------------\n\n");

	printf("------------delete list----------------------\n");
	head = delete_node(head, 2);
	printf("delete the 3th node :\n");
	Print(head);
	printf("------------end delete ----------------------\n\n");

	printf("------------reverse list----------------------\n");
	head = reverse(head);
	Print(head);
	printf("------------end reverse ----------------------\n\n");


	node *middle = new node();
	middle = searchMidNode(head);
	printf("middle index data:%d\n", middle->data);//t中间元素

	system("pause");

    return 0;
}



运行结果如下:
在这里插入图片描述
创建、查找、插入、删除、遍历都比较简单,看代码就能懂,重点理解下逆转。
假设连表如下:
在这里插入图片描述
逆转代码如下:

node * reverse(node * head)
{
	node *p, *q, *r;
	//空值判断
	if (head->next == NULL)
	{
		return NULL;
	}
	p = head->next;
	q = p->next;
	p->next = NULL;
	while (q!=NULL)
	{
		r = q->next;
		q->next = p;
		p = q;
		q = r;
	}
	head->next = p;
	return head;
}

先看代码3-11行:定义三个指针p,q,r,p指向第一个结点,q指向第二个结点,并将p做为尾结点。此时的链表如下:
图1
再看代码12-18行:14行,r指向q的下一个结点,见1,15行,并将p赋值给q->next,见2,16、17行进行右移操作,见3,4.
图2

在这里插入图片描述

待循环结束后,再将p赋值给head,此时链表转置完成。

在创建时,head->data还一直为空,其实位置可以用来存储链表的长度,这样会给后面的操作带来方便,比如找中间位置的值,还有计算长度就没必要线性遍历了,节省了时间,在删除与增加的时候,只要更新一下此值就好。

补充一个函数:今天看到人家单链表

/*
单链表逆转:将m到n的节点逆转,其余节点不动,1 <= m <= n <= 单链表长度
日期:2017年11月3日 22:10
*/
node * reverse(node * head,int m,int n)
{
	node *p, *q, *r,*a;
	//空值判断
	a = head;
	for (int i = 1;i<m;i++)
	{
		a = a->next;
	}	
	p = a->next;
	q = p->next;
	while (q != NULL && ++m <= n)
	{
		r = q->next;
		q->next = p;
		p = q;
		q = r;
	}	
	a->next->next = q;
	a->next = p;
	return head;
}

基本思路与逆转一致,只是要注意衔接、m=1情况的处理。由于本单链表自带head节点,遇到不带head节点的,可以先构造一个。 9-13行:将a指向m结点的前一个结点。 14-15行,指定p,q指针,用于逆转。16-22行,具体逆转与上一致,23-24行,用于衔接。网上还有别的做法,我觉得这种方法是比较好懂。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单链表的操作(创建、查找、插入、删除、遍历、就地逆转等) 的相关文章

  • jquerymobile-7 导航和多页面固定导航

    在开发的过程中 xff0c 我们经常会遇到在页面的底部有一排按钮 xff0c 我们可以根据这些按钮切换页面 xff0c 或者执行一些动作 在jquerymobile中我们可以在footer和header上添加这样的导航 下面看一个例子代码
  • phonegap入门--4 Camera 摄像头

    今天周六了 每次到了周六就不知道干嘛去 好没劲啊 有在北京的如果周六也没劲的 可以联系我大家一起出去玩 qq598660766 没事干 那就写写博客吧 今天介绍一下Camera这个对象 camera对象提供对设备默认摄像头应用程序的访问 C
  • android focusableInTouchMode设置为true导致OnClick事件失效,点击两次生效

    在开发中遇到focusableInTouchMode ture导致OnClick事件 点击两次生效 导致达不到效果 所以要分析源码解决问题 当在xml布局文件中 设置focusableInTouchMode ture 时 表示触摸事件可以让
  • Android自定义控件基础

    采用自定义控件解决重复编写代码的问题 总共分三步 1 写好一个自定义模板布局 title XML span class hljs pi lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34
  • String,StringBuffer,StringBuilder的区别(优缺点)

    最近学习到StringBuffer xff0c 心中有好些疑问 xff0c 搜索了一些关于String xff0c StringBuffer xff0c StringBuilder的东西 xff0c 现在整理一下 关于这三个类在字符串处理中
  • Android真机获得root权限修改文件权限

    好久没有更新博客了 xff0c 最近因为重装了系统导致所有的配置都不存在了 xff0c 当要修改Android权限去查看数据库文件的时候 xff0c 发现又忘记了怎么去获得修改权限 xff08 其实第一次弄这个内容的时候就费了很大的劲 xf
  • Android完全自定义控件并且实现监听事件

    本篇文章带来Android的完全自定义控件 载体是自定义一个开关的控件 xff0c 并且能够响应事件 xff0c 首先我们先创一个项目 xff0c 名字就叫ToggleView xff0c 修改MainActivity span class
  • Android屏幕适配实战

    说一下在项目里面遇到的一个问题 xff0c 和解决思路 需求来源于运营小姐姐 xff0c 她们希望在App的搜索关键字前面加上图片醒目效果图如下 布局很简单左边一个SimpleDraweeView xff0c 右边一个TextView xf
  • 定制阿里代码检查,实现你自己的代码规范检查

    几个月前 xff0c 阿里开源了p3c xff0c 我也接到了老大交给我的技术改造 是这样的 xff0c app是老项目了 xff0c 半年前接入了ARouter xff0c 由于Activity繁多 xff0c 就没有去全局支持ARout
  • Fresco内部诟病引起的初次从网络加载PNG图片失败

    如题描述 xff0c 这个问题在项目中存在已久 xff0c 今天由于自己的功能在首页 xff0c 初次启动的体验极其糟糕 xff0c 所以硬下头皮把这个问题解决了 先来描述一下怎么样一个差的体验吧 就是当我第一次加载网络PNG xff08
  • 华为OpenEuler体验系列(20)-树莓派 安全渗透测试环境安装

    一 下载镜像 xff1a 地址 xff1a https www openeuler org zh download 二 格式化TF卡和烧录系统 使用过的SD卡 xff0c 用SD Card Formatter格式化SD卡 选择好SD卡后格式
  • Ubuntu开机没有图形界面 进入tty的拯救方法

    Ubuntu开机没有图形界面 进入tty的拯救方法 1 从命令行模式登录2 检查是否可以连网3 安装图形界面参考 由于卸载软件的过程中误删了系统图形界面相关的文件 xff0c 导致开机无法进入图形界面 xff0c 需要通过命令重新安装 1
  • 什么是人工智能?

    Extinguished philosophies lie about the cradle of every science as the strangled snakes beside that of Hercules adapted
  • android 11.0 SystemUI手势上滑显示导航栏和隐藏导航栏

    1 概述 在11 0的产品开发中 对于SystemUI导航栏状态栏的功能定制需求 有要求需要通过上滑来控制导航栏显示 然后3秒钟后自动消失导航栏 实现一个通过手势上滑显示导航栏的需求 2 SystemUI手势上滑显示导航栏和隐藏导航栏相关核
  • 电脑专业英语

    电脑专业英语 1 file n 文件 xff1b v 保存文件 2 command n 命令 xff0c 指令 3 use v 使用 xff0c 用途 4 program n 程序 5 line n 数据 xff0c 程序 行 xff0c
  • 关于极大连通子图与极小连通子图的解释

    对于极大连通子图 xff0c 我们可以把它分成3各部分来看 1 必须是子图 xff08 子图中的顶点 边都是原图的子集 xff09 2 连通 xff08 对于两个顶点u v xff0c 如果存在u到v的边 xff0c 那这两个点就是连通的
  • 公司信息系统架构建设规划

    企业的信息化建设的基础是构建企业的信息系统架构 xff08 也可称之为信息化架构 xff09 xff0c 信息系统架构又由应用架构 数据架构 技术架构和治理架构4部分组成 xff0c 本建议书主要以技术架构 应用架构以及技术架构为对象加以说
  • C#使用rabbitmq (简单例子)

    首先在visual studio项目里面用nuget工具加入 easyNetQ DLL 然后做一个help类 using System using System Collections Generic using System Linq u
  • 我的2013,梦在路上

    我的2013 xff0c 在路上 今年最后一次给姐姐打电话 xff0c 她在那里像我炫耀自己和爸爸妈妈一起跨年 xff0c 说1314的意义 xff0c 而我还在北京苦逼着 回想2013年对于我来说 xff0c 或许是不错的一年 这一年我进
  • 事务是什么?

    事务 xff1a 简单来说 xff0c 事务就是几个操作要作为一个处理单元来完成 xff0c 要么全部完成 xff0c 要么全部不完成 事务可以是一条SQL语句 xff0c 也可以是多条SQL语句或者整个程序 事务日志 xff1a 重做日志

随机推荐

  • 各种加解密算法比较

    一 加密 算法介绍 对称加密算法 对称加密算法用来对敏感数据等信息进行加密 xff0c 常用的算法包括 xff1a DES xff08 Data Encryption Standard xff09 xff1a 数据加密标准 xff0c 速度
  • 系统提示缺少libltdl.so.3

    今天安装heartbeat pils 2 1 4 11 el5 i386 rpm时 xff0c 显示 因为重新安装的linux xff0c 所以以前的一些操作都丢失了 xff0c 安装了一大堆的开发工具 34 Development lib
  • 安装的虚拟机没有了VMnet1

    虚拟的东西终归时有其缺陷的 xff0c 大家安装好虚拟机之后 xff0c 网络适配器中是有VMnat1和VMnat8俩块网卡的 xff0c VMnat1负责主机域虚拟机的host only通信 xff0c 而VMnat8则负责和虚拟机的na
  • mount:No medium found

    使用vmware时 xff0c 科技将iso作为系统的镜像 但是 xff0c 在配置yum源的时候 xff0c 可能会遇到这样的问题 究其原因 xff0c 是由于镜像文件未启动 解决方法 xff1a 右击 xff0c 点击连接 xff0c
  • Android 9.0 Settings 搜索功能屏蔽某个app

    1 概述 在9 0的系统rom产品定制化开发过程中 在系统Settings的开发功能中 最近产品需求要求去掉搜索中屏蔽某个app的搜索 就是根据包名 不让搜索出某个app 在系统setting中 搜索功能中 根据包名过滤掉某个app的搜索功
  • 什么叫跨平台语言

    什么叫跨平台语言呢 xff1f 今天就个人理解简单谈一下 xff0c 还望指正 简单的说 xff0c 就像插座和插头 xff0c 这世界上有没有完全通用的插座呢 xff1f 没有 但是比如某家公司 xff0c 制作了插座和插头 xff0c
  • rpm包管理功能全解

    通常在linux系统中 xff0c 服务是要通过程序来提供的 xff0c 通过调用各种接口编译好之后的源码包文件 xff0c 需要使用rpm xff08 redhat package manager xff09 命令来安装并提供相应的服务
  • 加密

    lt div id 61 34 article content 34 class 61 34 article content clearfix csdn tracking statistics 34 data pid 61 34 blog
  • Ubuntu加域后域账号登录账号串号

    Ubuntu加域后域账号登录账号串号 错误实例原因分析解决办法 错误实例 例如这里用账号test01登录Ubuntu桌面 xff0c 进入桌面后进入终端 test02 64 PCtest01 这里可以看出账号不是test01 原因分析 加入
  • 虚拟机迁移提示设备 “HD audio“ 的备用类型不受支持

    错误原因 尝试 vMotion 虚拟机失败并显示以下错误 xff1a 设备 HD audio 的备用类型不受支持 HD 音频设备在 ESXi 的虚拟机上不受支持 xff0c 并且不能作为通过 vSphere Client 添加的设备 因为图
  • 获取windows10远程桌面记录的用户名密码

    Windows 密码恢复工具 单击此下载链接 输入 download 作为用户名 xff0c 然后 39 nirsoft123 39 作为密码 下载软件包后 xff0c 使用以下密码从中提取文件 xff1a nirsoft123 双击net
  • hisi3516下yuv图片到nnie bgr_u8c3格式转换

    首先要看的sdk文档 xff08 HiIVE API 参考 xff09 其中详细说明了 IVE IMAGE TYPE YUV420SP IVE IMAGE TYPE YUV420P IVE IMAGE TYPE YUV422SP IVE I
  • android 交叉编译dbow3

    ndk 20版本是可以直接过的 xff0c 但是ndk14b时 xff0c 编译报如下错误 xff1a arm linux androideabi gcc error unrecognized command line option 39
  • macOS无法验证此App不包含恶意软件

    换了iMac xff0c 刚用有点不习惯 xff0c 特别是它这安全机制 xff0c 比ubuntu高太多 想用android ndk进行交叉编译 xff0c 里面的很多那种可执行文件 xff0c 会弹出如下错误 解决办法 xff1a 1
  • 初识opencl

    初识opencl 以一个例子开头 以一个例子开头 在自己的笔记本电脑上 win10 安装intel的那个opencl包 xff0c 安装后 xff0c 记得将include与lib包拷贝出来 xff0c 然后在以后的使用中只要链接这个库就o
  • Android 10.0 系统settings系统属性控制一级菜单显示隐藏

    1 概述 在进行定制化开发中 系统settings的一级菜单有些在客户需求中 要求通过系统属性来控制显示隐藏 从而达到控制一级菜单的显示的目的 而系统settings是通过静态加载的方式负责显示隐藏 2 系统Settings一级菜单显示隐藏
  • OpenCL并行加减乘除示例——数据并行

    数据并行化计算与任务并行化分解可以加快程序的运行速度 现在只讲数据并行 下一节讲任务并行 如下基本算术例子 xff0c 输入数组A和数组B xff0c 得到输出数组C xff0c C的结果如图中output所示 A数组如下 xff1a 5行
  • 递归与非递归的比较

    递归与非递归的比较 非递归效率高 xff1b 递归代码写出来思路清晰 xff0c 可读性强 生成可执行文件大小应该和编译器有关吧 递归的话函数调用是有开销的 xff0c 而且递归的次数受堆栈大小的限制 以二叉树搜索为例 xff1a bool
  • Package **** was not found in the pkg-config search path.

    Package was not found in the pkg config search path Package grpc 43 43 was not found in the pkg config search path Perha
  • 单链表的操作(创建、查找、插入、删除、遍历、就地逆转等)

    先贴原代码 xff0c 后面再一一做解释 单链表的各创建等等操作 日期 xff1a 2017年11月3日 21 xff1a 46 include 34 stdafx h 34 include lt iostream gt include 3