单链表的增删改查

<数据结构>链表实战之单链表与双链表的增删改查 上篇博客分享了创建链表传入二级指针的细节,那么今天就分享几个c语言课程实践设计吧。这些程序设计搞懂了的话相当于链表的基础知识牢牢掌握了,那么再应对复杂的链表类的题也就能慢慢钻研了。学习是一个积累的过程,想要游刃有余就得勤学苦练!...... 阅读详情

添加

单链表的添加分为两种:

  1. 无序的添加,直接在链表末端加入新的节点元素
  2. 有序添加,根据序号添加到对应的节点位置
    效果图如下
    在这里插入图片描述

话不多说,代码实现一波。代码的备注写的很清楚,不懂的地方可以看备注

代码实现

  1. 无序添加,直接在链表末端加入新的节点元素
// 添加节点到单链表
	// 不考虑编号的顺序时,找到当前链表的最后节点;将最后这个节点的next指向新的节点
	public void add(HeroNode heroNode) {
		// 因为头结点不能动,因此需要一个辅助遍历temp
		HeroNode temp = head;
		// 遍历链表,找到最后
		while (true) {
			if (temp.next == null) {
				break;
			}
			// 如果不是最后一个,temp后移。
			temp = temp.next;
		}
		// 退出while循环时,temp只想你链表最后的节点
		// 将最后一个节点的next指向新节点
		temp.next = heroNode;
	}
  1. 有序添加,根据序号添加到对应的节点位置
// 添加时按序号排序插入指定位置,如果有则提示已存在
	public void addByOrder(HeroNode heroNode) {
		// 因为头结点不能动,因此需要一个辅助来找到添加位置;temp是位于添加位置的前一个节点
		HeroNode temp = head;
		boolean flag = false;// 添加的编号是否存在,默认为false
		while (true) {
			if (temp.next == null) {// 说明temp已经在链表最后
				break;
			}
			if (temp.next.no > heroNode.no) {// 找到位置,就在temp的后面插入
				break;
			} else if (temp.next.no == heroNode.no) {// 要添加的位置已经存在
				flag = true;
				break;
			}
			temp = temp.next;// 后移遍历当前链表
		}
		// 判断flag的值
		if (flag) {
			System.out.printf("准备插入的英雄的编号%d已经存在,不能加入\n", heroNode.no);
		} else {
			// 插入到链表中,temp的后面
			heroNode.next = temp.next;
			temp.next = heroNode;
		}
	}
  1. 根据编号修改信息
// 修改节点信息,根据no编号来修改,no编号不能改
	public void update(HeroNode newHeroNode) {
		// 判断是否为空
		if (head.next == null) {
			System.out.println("链表为空!!!");
			return;
		}
		// 找到需要修改的节点,
		// 定义一个辅助变量
		HeroNode temp = head.next;
		boolean flag = false;
		while (true) {
			if (temp == null) {
				break;// 到链表的最后,遍历结束
			}
			if (temp.no == newHeroNode.no) {
				// 找到
				flag = true;
				break;
			}
			temp = temp.next;
		}
		// 根据flag判断是否找到修改的节点
		if (flag) {
			temp.name = newHeroNode.name;
			temp.nickname = newHeroNode.nickname;
		} else {// 没有找到
			System.out.printf("没有找到编号%的节点不能修改\n", newHeroNode.no);
		}
	}
  1. 删除结点
// 删除结点
	// head不能动,添加temp辅助节点在,找到待删除节点的前一个节点
	// 比较时,是temp.next.no和需要删除的节点no比较
	public void delete(int no) {
		HeroNode temp = head;
		boolean flag = false;
		while (true) {
			if (temp.next == null) {
				break;
			}
			if (temp.next.no == no) {
				// 找到待删除节点的前一个节点
				flag = true;
				break;
			}
			temp = temp.next;// temp后移,遍历
		}
		// 判断flag
		if (flag) {// 找到。可以删除
			temp.next = temp.next.next;
		} else {
			System.out.printf("要删除的节点%d不存在\n", no);
		}
	}

代码整合

package com.linkedlist;

public class SingleLinkedListDemo {

	public static void main(String[] args) {
		// 测试
		// 创建节点
		HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");
		HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
		HeroNode hero3 = new HeroNode(3, "吴用", "智多星");
		HeroNode hero4 = new HeroNode(4, "林冲", "豹子头");

		// 创建链表
		SingleLinkedList singleLinkedList = new SingleLinkedList();
		// 加入
		// singleLinkedList.add(hero1);
		// singleLinkedList.add(hero2);
		// singleLinkedList.add(hero3);
		// singleLinkedList.add(hero4);

		// 加入按照编号加入
		singleLinkedList.addByOrder(hero1);
		singleLinkedList.addByOrder(hero4);
		singleLinkedList.addByOrder(hero3);
		singleLinkedList.addByOrder(hero2);
		singleLinkedList.addByOrder(hero1);

		// 显示
		singleLinkedList.list();

		// 测试修改节点
		HeroNode newHeroNode = new HeroNode(2, "小卢", "玉麒麟~~");
		singleLinkedList.update(newHeroNode);

		// 显示
		System.out.println("修改后的~~~");
		singleLinkedList.list();

		// 删除一个节点
		singleLinkedList.delete(1);
		// singleLinkedList.delete(4);
		// singleLinkedList.delete(2);
		// singleLinkedList.delete(3);
		System.out.println("delete后的~~~");
		singleLinkedList.list();
	}

}

// 定义SingleLinkedList管理英雄人物
class SingleLinkedList {
	// 初始化头结点,头结点不要动
	private HeroNode head = new HeroNode(0, "", "");

	// 添加节点到单链表
	// 不考虑编号的顺序时,找到当前链表的最后节点;将最后这个节点的next指向新的节点
	public void add(HeroNode heroNode) {
		// 因为头结点不能动,因此需要一个辅助遍历temp
		HeroNode temp = head;
		// 遍历链表,找到最后
		while (true) {
			if (temp.next == null) {
				break;
			}
			// 如果不是最后一个,temp后移。
			temp = temp.next;
		}
		// 退出while循环时,temp只想你链表最后的节点
		// 将最后一个节点的next指向新节点
		temp.next = heroNode;
	}

	// 添加时按序号排序插入指定位置,如果有则提示已存在
	public void addByOrder(HeroNode heroNode) {
		// 因为头结点不能动,因此需要一个辅助来找到添加位置;temp是位于添加位置的前一个节点
		HeroNode temp = head;
		boolean flag = false;// 添加的编号是否存在,默认为false
		while (true) {
			if (temp.next == null) {// 说明temp已经在链表最后
				break;
			}
			if (temp.next.no > heroNode.no) {// 找到位置,就在temp的后面插入
				break;
			} else if (temp.next.no == heroNode.no) {// 要添加的位置已经存在
				flag = true;
				break;
			}
			temp = temp.next;// 后移遍历当前链表
		}
		// 判断flag的值
		if (flag) {
			System.out.printf("准备插入的英雄的编号%d已经存在,不能加入\n", heroNode.no);
		} else {
			// 插入到链表中,temp的后面
			heroNode.next = temp.next;
			temp.next = heroNode;
		}
	}

	// 修改节点信息,根据no编号来修改,no编号不能改
	public void update(HeroNode newHeroNode) {
		// 判断是否为空
		if (head.next == null) {
			System.out.println("链表为空!!!");
			return;
		}
		// 找到需要修改的节点,
		// 定义一个辅助变量
		HeroNode temp = head.next;
		boolean flag = false;
		while (true) {
			if (temp == null) {
				break;// 到链表的最后,遍历结束
			}
			if (temp.no == newHeroNode.no) {
				// 找到
				flag = true;
				break;
			}
			temp = temp.next;
		}
		// 根据flag判断是否找到修改的节点
		if (flag) {
			temp.name = newHeroNode.name;
			temp.nickname = newHeroNode.nickname;
		} else {// 没有找到
			System.out.printf("没有找到编号%的节点不能修改\n", newHeroNode.no);
		}
	}

	// 删除结点
	// head不能动,添加temp辅助节点在,找到待删除节点的前一个节点
	// 比较时,是temp.next.no和需要删除的节点no比较
	public void delete(int no) {
		HeroNode temp = head;
		boolean flag = false;
		while (true) {
			if (temp.next == null) {
				break;
			}
			if (temp.next.no == no) {
				// 找到待删除节点的前一个节点
				flag = true;
				break;
			}
			temp = temp.next;// temp后移,遍历
		}
		// 判断flag
		if (flag) {// 找到。可以删除
			temp.next = temp.next.next;
		} else {
			System.out.printf("要删除的节点%d不存在\n", no);
		}
	}

	// 显示链表[遍历]
	public void list() {
		// 判断链表是否为空
		if (head.next == null) {
			System.out.println("链表为空");
			return;
		}
		// 因为头节点,不能动,添加一个辅助变量来实现遍历
		HeroNode temp = head.next;
		while (true) {
			if (temp == null) {
				break;
			}
			// 输出节点信息
			System.out.println(temp);
			// 将temp后移,一定要小心
			temp = temp.next;
		}
	}
}

// 定义HeroNode,每一个HeroNode对象就是一个节点
class HeroNode {
	public int no;
	public String name;
	public String nickname;
	public HeroNode next;

	// 构造器
	public HeroNode(int no, String name, String nickname) {
		this.no = no;
		this.name = name;
		this.nickname = nickname;
	}

	// 为了显示方便重写toString
	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
	}
}
zblog mysql数据库无法连接_ZBlog博客网站错误:MySQL数据库无法连接 前言前天搭建的博客网站,睡醒一觉起来网站挂逼了,其间无任何操作。主页都进不去,提示“MySQL数据库无法连接”,无论怎么刷新重启服务器都没用。最终从中午1点搞到凌晨2点,皇天不负有心人终于解决了。其实问题很简单,只是没这方面的经验,走了很多弯路。我本人并不是搞WEB的,搞这个博客纯碎就是玩玩罢了。处理这个问题的时候查了很久的资料,都是一些没太大意义的,无非就是让你改zb_user/c_option... 阅读详情

相关推荐

Multisim仿真入门:单相半波可控整流电路从搭建到波形分析(附避坑指南)

本文为电力电子技术初学者提供了一份详细的Multisim仿真指南,手把手教你从零搭建单相半波可控整流电路。通过对比纯电阻、阻感负载及加入续流二极管后的波形变化,直观理解晶闸管触发、电感续流等核心原理,并附有实用的参数设置与常见问题避坑指南,帮助你将抽象理论转化为可视化的工程实践。

weixin_29208077的博客 343

【数据结构】单链表的增删查改

在上一节中我们提到了顺序表有如下缺陷:在头部/中间的插入与删除需要挪动数据,时间复杂度为O(N),效率低;增容需要申请新空间,可能会拷贝数据,释放旧空间,会有不小的时间消耗;增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到 200,如果我们再继续插入了5个数据,后面没有数据插入了,那么会浪费95个数据空间;基于顺序表的这些不足,我们设计出了链表。

StandDev的博客 635

lvgl 实现表格table,并且固定表头

嵌入式实现table,lvgl 实现原生表格table组件

m0_61704502的博客 1271

数据结构 - 单链表 (增删查改详解)

数据结构-单链表(增删查改详解)

xiaoHu_C的博客 1657

保姆级教程:手把手调试PX4Ctrl的油门映射与姿态控制(附ROS节点配置)

本文提供PX4Ctrl的深度调参指南,涵盖油门映射、姿态控制及ROS节点配置等关键环节。通过详细解析PX4控制器的核心逻辑、递归最小二乘法(RLS)参数估计及状态机设计,帮助开发者优化无人机飞控性能。附实战案例与安全调试建议,适合PX4开发者进阶学习。

weixin_30363981的博客 382

五、2K0300 久久派开发板的GPIO控制与Shell脚本自动化实战

本文详细介绍了基于龙芯2K0300处理器的久久派开发板的GPIO控制方法,通过sysfs文件系统实现LED控制和传感器读取。重点讲解了Shell脚本自动化实战,包括LED闪烁、流水灯效果和传感器数据采集,为物联网项目开发提供完整解决方案。

silver的专栏 686

单链表(增删改查)【超详细】

单链表的存储与顺序表的存储不一样,单链表不仅仅存放数值,还要存放下一个结点的地址代码//存放单链表的值//存放下一个单链表的地址}SLNode;当有了单链表的存储定义,我们就可以对单链表进行存放结点。

加油!!! 4315

行人重识别(ReID)基础知识入门

行人重识别(Person re-identification)主要目的是针对出现在监控摄像头内的某个目标行人,准确快速地从监控网络其他摄像头内的大量行人中将这个目标行人标识出来。如图所示一个区域有多个摄像头拍摄视频序列,ReID的要求对一个摄像头下感兴趣的行人,检索到该行人在其他摄像头下出现的所有图片。

用于记录 1万+

数据结构-单链表的增删改查

测试函数的功能时最好写成test函数形式,不要写成菜单形式,便于调试。

m0_62159976的博客 225

publisher与subscriber话题的消息类型md5sum不一致问题

[ERROR] [1604235557.591296096]: Client [/range_vision_fusion_01] wants topic /detection/vision_objects to have datatype/md5sum [autoware_msgs/DetectedObjectArray/13415342e539aa36ea9a6f04ffaf39b4], but our version has [autoware_msgs/DetectedObjectArray/c16a

cxhmike的博客 6619

74HC165级联踩坑实录:STM32读取32路开关状态,时序调试与常见问题排查

本文详细介绍了74HC165级联在STM32读取32路开关状态时的时序调试与常见问题排查。从硬件设计的PCB布局优化、电源噪声控制,到软件时序的精确调校和数据采集策略,提供了完整的解决方案。通过逻辑分析仪和示波器的高效使用,解决了信号延迟和干扰问题,最终实现了稳定可靠的32路信号读取。

weixin_34046298的博客 313

单链表的增删改查(数据结构)

概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

m0_62048999的博客 1910

122、Android Camera HAL3 框架:Request、Result、Metadata 的异步管道模型

本文深入剖析了Android Camera HAL3框架中的异步管道模型,围绕Request、Result和Metadata三个核心要素展开。作者通过实际案例(黑屏闪退问题)切入,揭示了异步模型中常见的帧序错乱陷阱。文章详细阐释了三个角色的交互机制,指出HAL3采用生产者-消费者模式的关键特征:Request与Result一一对应但不保证顺序。针对开发实践,总结了三个必须加锁的场景和回调函数的锁使用禁忌,并给出解决帧序问题的具体方案(独立帧号生成器)。最后提出五项经验性建议,强调异步模型带来的灵活性与复杂性

sundong_81的博客 211

【数据结构】—— 单链表的增删改查

单链表的创建、删除、更改、查看

周小末天天开心的博客 2040

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

golang单链表(增删改查)

单链表-LinkedList 链表(Linked list)是一种常见的基础数据结构,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针。由于不是必须按顺序存储,链表在插入的时候可以达到O(1),比顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间。 单链表的示意图: 说明:一般来说,为了比较好的对单链表进行增删改查,我们都会给它设置一个头结点,头结点的...

疯狂的鸭血 1308

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java单链表的增删改查

说在前面:过年这几天想学习却静不下心,一个单链表看了5天,,,咳咳,好了,现在来总结下但单链表的一些简单的东西 1.什么是链表 链表是有序的列表,但是他在内存中的存储和列表并不一样,如图 链表是以节点的方式来存储数据的,是链式存储,他的每个节点分为两部分,data域和next指针域,data域是用来保存该节点的数据,next域用来指向下一个节点,所以链表中的各个节点并不一定是连续存储的。 逻辑示...

interesting_code的博客 528

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

超详细实现单链表的基础增删改查——基于C语言实现

依据前面所提的关于不带头单向不循环链表的结构,我们可以得出,单链表每个节点有两个变量,一个用来存放数据,一个用来指向下一节点,那么我们就可以根据这个结构来定义我们的单链表。}SLTNode;其中,我们将int重定义为SLTDataType,是为了后续方便我们修改整个链表的数据类型,将struct SListNode重定义为SLTNode,方便我们后面使用。

m0_74476035的博客 1051

单链表中的增删改查-Java实现

优质文档值得推荐 [Java]单链表中的增删改查

天天向上 449

java单链表 提供增删改查_java实现单链表增删改查的实例代码详解

package 数据结构算法.链表;/**定义节点* 链表由节点构成*/public class Node {private E e; //数据dataprivate Node next; //指向下一个节点public Node() {}public Node(E e) {this.e = e;}public Node getNext() {return next;}public void s...

weixin_42360733的博客 100

单链表的增删改查(java实现)

早上起来完成了单链表的增删改查,上一篇中是傻瓜插入,这一篇中可以根据给入的编号进行添加,这次是用Java实现,重新完成了大一小学期的作业 一些亮点在程序注释中写的比较清楚了, 在判断插入位置是,node.no < temp.next.no 这个是值得回味的 因为程序是整体写完才整体测试的,所以完成代码很快,但是debug用了比较长的时间,得到的启发就是,写程序的时候考虑的周全一些,以后的de...

大道至简 1123

单链表的增删改查(Java)

单链表的增删改查(Java)

qq_39792300的博客 265
上一篇: 最短路径
下一篇: 数组模拟栈思路分析及代码实现
lu_long
博客等级 码龄8年 11粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值