C#单向链表实现:在当前节点后插入新数据的方法Insert()

目录

一、涉及到的知识点

1.插入算法

2.示例中current 和 _current 的作用

3.current 和 _current 能否合并为一个变量

4.单向链表节点类的三个属性

(1)Next属性:

(2) Value属性:

(3)Previous属性:

二、Insert()方法实例


一、涉及到的知识点

1.插入算法

        在单向链表的当前位置插入一个新的节点,在插入新节点之前,需要找到当前节点。如果当前节点为空,需要找到链表的最后一个节点,然后将最后一个节点设置为当前节点。这样,新节点就可以插入到链表的末尾。

·        在插入新节点时,需要正确设置新节点的 Next 和 Previous 属性。设置新节点的 Next 和 Previous 属性具体如下:

newNode.Next = current.Next;
newNode.Previous = current;
current.Next = newNode;
_current = newNode;

        这样设置确保了新节点被正确地插入到链表中,并且链表的其他部分也得到正确更新。 

2.示例中current 和 _current 的作用

        在实例程序中,current 和 _current 的作用是有区别的。它们主要用于在插入新节点时跟踪链表中的当前节点。让我来解释一下它们各自的用途:

  • current:是一个临时变量,用于在插入新节点之前找到链表中的当前节点。如果链表不为空,它会从链表头节点开始遍历,直到找到最后一个节点。在这个过程中,current 会被不断更新为当前节点的下一个节点。最后,current 会被设置为最后一个节点。
  • _current:是一个静态变量,用于在整个链表操作过程中跟踪当前节点。在插入新节点时,_current 会被设置为新插入的节点。这样,在后续的操作中,可以使用 _current 来访问链表中的当前节点。

3.current 和 _current 能否合并为一个变量

        在源程序中将 current 和 _current 可以合并为一个变量。但是,将它们分开好处更多:

  • 代码的可读性:使用两个不同的变量名可以更清楚地表明它们在代码中的不同作用。使用 _current 作为静态变量可以清楚地表明它在整个链表操作过程中的作用,而使用 current 作为局部变量可以清楚地表明它在插入新节点过程中的作用。
  • 代码的简洁性:将它们分开可以使代码更简洁。如果将它们合并为一个变量,那么在插入新节点之前需要不断地更新这个变量。而将它们分开,只需要在找到最后一个节点后,将 _current 设置为 current,就可以完成链表的插入操作。

        总之,虽然可以将 current 和 _current 统一为一个变量,但将它们分开可以使代码更易读、更简洁。

4.单向链表节点类的三个属性

        在C#中,单向链表节点(通常称为节点或列表节点)通常使用一个公共类来表示,该类具有三个主要属性:

(1)Next属性:

        此属性表示链表中当前节点的下一个节点。在单向链表中,只能从头节点开始向前遍历节点,因此每个节点仅需维护一个指向其后继节点的引用。Next属性通常是一个指向ListNode类型对象的引用。在链表的末尾,Next属性将为null。

public class ListNode
{public int Value { get; set; }public ListNode Next { get; set; }public ListNode(int value){Value = value;}
}

         或

public class ListNode(int value)
{public int Value { get; set; } = value;public ListNode? Next { get; set; } = null;public ListNode? Previous { get; set; } = null;
}

(2) Value属性:

        此属性表示当前节点所存储的值。在链表中,每个节点都存储一个值,该值可以是任何类型,如int、double、string等。Value属性通常是一个泛型类型T,以便在不同类型的链表中重用相同的节点类。

public class ListNode<T>
{public T Value { get; set; }public ListNode<T> Next { get; set; }public ListNode(T value){Value = value;}
}

         或

 public class ListNode<T>(T value){public T Value { get; set; } = value;public ListNode<T>? Next { get; set; }}

(3)Previous属性:

        在某些情况下,需要使用双向链表即每个节点不仅维护一个指向其后继节点的引用,还维护一个指向其前驱节点的引用。在这种情况下,Previous属性表示链表中当前节点的前一个节点。Previous属性通常是一个指向ListNode类型对象的引用。在链表的头部,Previous属性将为null。

public class ListNode<T> 
{ public T Value { get; set; } public ListNode<T> Next { get; set; } public ListNode<T> Previous { get; set; }public ListNode(T value) { Value = value; } 
}

二、Insert()方法实例

// 单向链表在当前位置插入新数据的方法
namespace _131_10
{public class ListNode(int value){public int Value { get; set; } = value;public ListNode? Next { get; set; } = null;public ListNode? Previous { get; set; } = null;}public class LinkedList{private static ListNode? _head;private static ListNode? _current;public LinkedList() => _head = null;/// <summary>/// 在当前位置插入数据,/// 不对数据排序,也不比较数据/// </summary>public static void Insert(int value){// 创建一个新的节点var newNode = new ListNode(value);// 如果链表为空,将新节点设置为头节点if (_head == null){_head = newNode;_current = newNode;return;}// 找到当前节点var current = _current;if (current == null){//current = _head;_current = _head;while (_current.Next != null){_current = _current.Next;}current = _current;}// 在当前位置插入新节点newNode.Next = current.Next;newNode.Previous = current;current.Next = newNode;_current = newNode;}public static void Display(){var current = _head;while (current != null){Console.Write(current.Value + " ");current = current.Next;}Console.WriteLine();}class Program{static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);// 链表数据初始化_head = new(5){Next = new ListNode(2)};_head.Next.Next = new ListNode(8){Next = new ListNode(1)};Display();Console.WriteLine("**初始数据**");_current = _head.Next.Next; //设置当前节点为第三个节点(值为8)Insert(9);                  //在当前位置插入数据9Display(); Console.WriteLine("**插入9**");}}}
}
//运行结果:
/*
5 2 8 1
**初始数据**
5 2 8 9 1
**插入9***/

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

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

相关文章

【ArcPy】批量读取文件夹excel中XY并转为点shp

示例展示 代码 只读取excel中含有XY字段的文件&#xff0c;并将矢量命名为excel文件名称。 import os import pandas as pd import arcpy folder_path r"C:\Users\admin\Desktop\excelfile" extension"xlsx" files [file for file in os.listdir(folder…

SpringCloud gateway限流无效,redis版本低的问题

在使用springCloud gateway的限流功能的时候&#xff0c;配置RedisRateLimiter限流无效&#xff0c;后来发现是Redis版本过低导致的问题&#xff0c;实测 Redis版本为3.0.504时限流无效&#xff0c;改用7.0.x版本的Redis后限流生效。查了资料发现很多人都遇见过这个问题&#x…

RedisTemplate 序列化成功,反序列化失败List, Set, Map失败

RedisTemplate 序列化成功&#xff0c;反序列化失败List, Set, Map失败 异常信息RedisTemplate配置异常原因错误代码示例解决方法 序列化成功&#xff0c;反序列化失败 异常信息 Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve ty…

小程序事件处理

事件处理 一个应用仅仅只有界面展示是不够的&#xff0c;还需要和用户做交互&#xff0c;例如&#xff1a;响应用户的点击、获取用户输入的值等等&#xff0c;在小程序里边&#xff0c;我们就通过编写 JS 脚本文件来处理用户的操作 1. 事件绑定和事件对象 小程序中绑定事件与…

React之组件定义和事件处理

一、组件的分类 在react中&#xff0c;组件分为函数组件和class组件&#xff0c;也就是无状态组件和有状态组件。 * 更过时候我们应该区别使用无状态组件&#xff0c;因为如果有状态组件会触发生命周期所对应的一些函数 * 一旦触发他生命周期的函数&#xff0c;它就会影响当前项…

如何设置从小程序跳转到其它小程序

​有的商家有多个小程序&#xff0c;希望能够通过一个小程序链接到所有其它小程序&#xff0c;用户可以通过点击跳转链接实现从一个小程序跳转到另一个小程序。要怎么才能实现这样的跳转呢。下面具体介绍。 1. 设置跳转。在小程序管理员后台->分类管理&#xff0c;添加一个…

ssm个人学习01

Spring配置文件: spring环境的搭建: 1:导入对应的spring坐标 也就是依赖 2:编写controller, service, dao相关的代码 3:创建配置文件(在resource下面配置文件) 例如:applicationContext.xml <bean id "" class ""> <property name "&…

Node.js 中 fs 模块文件操作的应用教程

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它可以让 JavaScript 代码在服务器端运行。在 Node.js 中&#xff0c;fs 模块是用来处理文件系统操作的模块。通过 fs 模块&#xff0c;我们可以进行文件的读取、写入、删除等操作。本教程将介绍如何在 No…

工作电压范围宽的国产音频限幅器D2761用于蓝牙音箱,输出噪声最大仅-90dBV

近年来随着相关技术的不断提升&#xff0c;音箱也逐渐从传统的音箱向智能音箱、无线音箱升级。同时在消费升级的背景下&#xff0c;智能音箱成为人们提升生活品质的方式之一。智能音箱是智能化和语音交互技术的产物&#xff0c;具有点歌、购物、控制智能家居设备等功能&#xf…

python水表识别图像识别深度学习 CNN

python水表识别&#xff0c;图像识别深度学习 CNN&#xff0c;Opencv,Keras 重点&#xff1a;项目和文档是本人近期原创所作&#xff01;程序可以将水表图片里面的数据进行深度学习&#xff0c;提取相关信息训练&#xff0c;lw1.3万字重复15%&#xff0c;可以直接上交那种&…

Vue中<style scoped lang=“scss“>的含义

这段代码中的<style scoped lang"scss">是HTML和Vue框架结合使用时常见的一个模式&#xff0c;具体含义如下&#xff1a; scoped&#xff1a;这是一个Vue.js特有的属性&#xff0c;用来指定样式只应用于当前组件的元素。没有这个属性时&#xff0c;样式会全局应…

python给企微发消息

方法一&#xff1a;webhook方式。使用群机器人给企微群发消息 import requestsdef qwxsendmessage(msg):urlhttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?key6c598840-804a-4eb5-a999-a023313 #url换成自己群机器人的webhookurldata{msgtype:text,text:{content:msg}}…

elasticsearch7.17 terms聚合性能提升90%+

背景 ES7 相比于 ES6 有多个层面的优化&#xff0c;对于开源的ES而言&#xff0c;升级是必经之路。 ES的使用场景非常多&#xff0c;在升级过程中可能会遇到非预期的结果&#xff1b; 比如之前文章提到的典型案例&#xff1a;ES7.17版本terms查询性能问题 ES7.17版本terms查…

【Python笔记-FastAPI】后台任务+WebSocket监控进度

目录 一、代码示例 二、执行说明 (一) 调用任务执行接口 (二) 监控任务进度 实现功能&#xff1a; 注册后台任务&#xff08;如&#xff1a;邮件发送、文件处理等异步场景&#xff0c;不影响接口返回&#xff09;监控后台任务执行进度&#xff08;进度条功能&#xff09;支…

常见的几种httpclient

工作是spring 项目一般都是使用ResTemplate 但是还是有些项目中会用到httpClient&#xff0c;没有毛用。 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> …

pclpy 点云法线

pclpy 点云法线 一、算法原理1.理论入门2.选择正确的比例 二、代码三、结果四、相关数据 一、算法原理 表面法线是几何表面的重要属性&#xff0c;在许多领域&#xff08;例如计算机图形应用程序&#xff09;中大量使用&#xff0c;以应用正确的光源来生成阴影和其他视觉效果。…

缓存穿透--一起学习吧之架构

缓存穿透是指查询一个一定不存在的数据&#xff0c;由于缓存是不命中时需要从数据库查询&#xff0c;查不到数据则不写入缓存&#xff0c;这将导致这个不存在的数据每次请求都要到数据库去查询&#xff0c;进而给数据库带来压力。在高并发场景下&#xff0c;如果某个key被高并发…

Android 混淆是啥玩意儿?

什么是混淆 Android混淆&#xff0c;是伴随着Android系统的流行而产生的一种Android APP保护技术&#xff0c;用于保护APP不被破解和逆向分析。简单的说&#xff0c;就是将原本正常的项目文件&#xff0c;对其类、方法、字段&#xff0c;重新命名a,b,c…之类的字母&#xff0c…

森林灭火利器|便携式森林消防灭火泵|恒峰智慧科技

随着人们对环境保护意识的不断提高&#xff0c;森林防火工作显得尤为重要。然而&#xff0c;传统的森林灭火方式存在诸多不便&#xff0c;如火势蔓延迅速、灭火效率低下等。为了更好地保护森林资源&#xff0c;科学家们研发出了一种便携式森林消防灭火泵&#xff0c;它的出现为…

利用css实现常见图形

1、正圆形 给正方形盒子设置圆角属性为宽高的50%。 div {width: 100px;height: 100px;background-color: plum;border-radius: 50%; } 2、胶囊形 给长方形盒子设置圆角属性为盒子高度的50%。 div {width: 200px;height: 100px;background-color: plum;border-radius: 50px…