C#单向链表实现:Append,Move,Delete,InsertAscending, InsertUnAscending,Clear

目录

一、链表定义

二、链表设计 

1.先定义一个结点类(Node)

2.再定义链表类(LinkedList)并依次设计其方法

3.再实现删除方法

4.再实现Insert 的方法

5.再增加InsertAscending升序插入

6.再增加 InsertUnAscending 的方法

7.再增加一个Clear方法,清空链表

8.再增加GetCurrentValue()方法取得当前的值

三、设计一个Main方法演示上述方法的应用


一、链表定义

        链表是一种特殊的数据结构,能够动态地存储一种结构类型数据。在开发复杂的系统时,经常会使用链表存储数据。

        链表是一种重要的数据结构,该结构由节点组成。每个节点包含两部分数据,第一部分是节点本身的数据,第二部分是指向下一个节点的指针。对于单向链表,链表中存在两个特殊的节点,分别为“头节点”和“尾节点”。头节点本身没有数据,只存储下一个节点的指针,尾节点只存储数据。

二、链表设计 

1.先定义一个结点类(Node)

public class Node
{public object Data { get; set; }public Node Next { get; set; }public Node Previous { get; set; }public Node(object data){Data = data;Next = null;Previous = null;}
}

2.再定义链表类(LinkedList)并依次设计其方法

        链表类中使用了三个指针:Head、Tail和Current。Head指针指向链表的头部,Tail指针指向链表的尾部,Current指针指向当前正在访问的结点。

        定义了以下方法来实现结点的移动和添加:

  • Append:在链表的尾部添加一个新的结点。
  • MoveFirst:将Current指针移动到链表的头部。
  • MovePrevious:将Current指针向前移动一位。
  • MoveNext:将Current指针向后移动一位。
  • MoveLast:将Current指针移动到最后一个数据。
public class LinkedList
{private static Node _head;private static Node _tail;private static Node _current;public LinkedList(){_head = null;_tail = null;_current = null;}public static void Append(object data){var newNode = new Node(data);if (_head == null){_head = newNode;_tail = newNode;}else{_tail.Next = newNode;newNode.Previous = _tail;_tail = newNode;}}public static void MoveFirst(){if (_head != null){_current = _head;}}public static void MovePrevious(){if (_current != null && _current.Previous != null){_current = _current.Previous;}}public static void MoveNext(){if (_current != null && _current.Next != null){_current = _current.Next;}}public static void MoveLast(){if (_tail != null){_current = _tail;}}
}

3.再实现删除方法

        要实现删除操作,添加一个名为 Delete 的方法。在该方法中,需要处理三种情况:删除头部结点、删除尾部结点和删除中间结点。

public static void Delete()
{if (_current == null){return;}// 删除头部结点if (_current == _head){if (_head == _tail){_head = null;_tail = null;}else{_head = _head.Next;_head.Previous = null;}}// 删除尾部结点else if (_current == _tail){_tail = _tail.Previous;_tail.Next = null;}// 删除中间结点else{var nextNode = _current.Next;var previousNode = _current.Previous;nextNode.Previous = previousNode;previousNode.Next = nextNode;}_current = null;
}

        在需要删除当前指向的结点时调用 Delete 方法。注意,在删除结点后,Current 指针会变成 null,需要重新定位到链表的头部或尾部。 

4.再实现Insert 的方法

        要实现插入操作,添加一个名为 Insert 的方法。在该方法中,需要处理四种情况:在头部插入、在尾部插入、在头部之前插入和在中间插入。

public static void Insert(int data)
{var newNode = new Node(data);// 在头部插入if (_head == null){_head = newNode;_tail = newNode;}// 在尾部插入else if (_current == null){_tail.Next = newNode;newNode.Previous = _tail;_tail = newNode;}// 在头部之前插入else if (_current == _head){var currentHead = _head;_head = newNode;_head.Next = currentHead;currentHead.Previous = _head;}// 在中间插入else{var nextNode = _current.Next;var previousNode = _current;nextNode.Previous = newNode;newNode.Next = nextNode;previousNode.Next = newNode;newNode.Previous = previousNode;}_current = newNode;
}

        需要在当前指向的结点处插入新结点时调用 Insert 方法。注意,在插入新结点后,Current 指针会指向新插入的结点。

5.再增加InsertAscending升序插入

// 升序插入
public static void InsertAscending(int data)
{var newNode = new Node(data);// 找到插入位置Node previousNode = null;Node nextNode = _head;while (nextNode != null && nextNode.Data < data){previousNode = nextNode;nextNode = nextNode.Next;}// 在找到的位置插入新结点if (previousNode == null){// 插入到头部Insert(data);}else if (nextNode == null){// 插入到尾部previousNode.Next = newNode;newNode.Previous = previousNode;newNode.Next = null;_tail = newNode;}else{// 插入到中间previousNode.Next = newNode;newNode.Previous = previousNode;newNode.Next = nextNode;nextNode.Previous = newNode;}_current = newNode;
}

6.再增加 InsertUnAscending 的方法

        添加一个名为 InsertUnAscending 的方法,该方法实现非升序插入功能。这意味着新结点将根据给定的值在链表中找到合适的位置并插入。

// 非升序插入
public static void InsertUnAscending(int data)
{var newNode = new Node(data);if (_head == null){_head = newNode;_tail = newNode;_current = newNode;}else if (data < _head.Data){newNode.Next = _head;_head = newNode;}else if (data > _tail.Data){newNode.Previous = _tail;_tail = newNode;}else{var current = _head;while (current.Next != null && current.Next.Data < data){current = current.Next;}newNode.Next = current.Next;newNode.Previous = current;if (current.Next != null){current.Next.Previous = newNode;}current.Next = newNode;}
}

        该方法首先检查链表是否为空。如果为空,则将新结点设置为头部、尾部和当前结点。如果新结点的值小于头部结点的值,则将新结点设置为头部,并将其指向原来的头部结点。如果新结点的值大于尾部结点的值,则将新结点设置为尾部,并将其指向原来的尾部结点。否则,我们将遍历链表,找到新结点应该插入的位置,然后将新结点插入到合适的位置。

7.再增加一个Clear方法,清空链表

// 清空链表
public static void Clear()
{_head = null;_tail = null;_current = null;
}

        将链表的头部、尾部和当前结点都设置为 null,从而清空整个链表。

8.再增加GetCurrentValue()方法取得当前的值

// 获取当前结点的值
public static int GetCurrentValue()
{if (_head != null){return (int)_current!.Data;}else{throw new InvalidOperationException("The linked list is empty.");}
}

        在这个修改后的实现中,如果head为null,我们抛出一个InvalidOperationException异常,指示链表为空。

        另外,您还可以根据您的需求选择返回一个默认值或进行其他处理:

public static int GetCurrentValue()
{if (_head != null){return (int)_head.Data;}else{return default; // 或者 return 0;}
}

三、设计一个Main方法演示上述方法的应用

// 单向链表Main方法
namespace _131_1
{class Program{static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);// 插入结点LinkedList.Append(5);LinkedList.Append(2);LinkedList.Append(8);LinkedList.Append(1);LinkedList.Append(3);// 获取当前结点的值Console.WriteLine("当前结点的值:");Console.WriteLine(LinkedList.GetCurrentValue());// 移动到第一个结点LinkedList.MoveFirst();Console.WriteLine("第一个结点的值:");Console.WriteLine(LinkedList.GetCurrentValue());// 移动到上一个结点LinkedList.MovePrevious();Console.WriteLine("上一个结点的值:");Console.WriteLine(LinkedList.GetCurrentValue());// 移动到下一个结点LinkedList.MoveNext();Console.WriteLine("下一个结点的值:");Console.WriteLine(LinkedList.GetCurrentValue());// 移动到最后一个结点LinkedList.MoveLast();Console.WriteLine("最后一个结点的值:");Console.WriteLine(LinkedList.GetCurrentValue());// 删除当前结点LinkedList.Delete();// 插入升序结点LinkedList.InsertAscending(6);LinkedList.InsertAscending(4);LinkedList.InsertAscending(9);// 插入非升序结点LinkedList.InsertUnAscending(7);LinkedList.InsertUnAscending(10);// 打印链表Console.WriteLine("Before clearing:");LinkedList.Print();// 清空链表LinkedList.Clear();// 打印清空后的链表Console.WriteLine("After clearing:");LinkedList.Print();}}
}

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

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

相关文章

数据库CLOB类型

CLOB&#xff08;Character Large Object&#xff09;是一种数据库字段类型&#xff0c;通常用于存储大量的字符数据&#xff0c;如文本、日志、XML 数据等。 在数据库中&#xff0c;CLOB 类型可以存储比普通字符串类型更大的数据量&#xff0c;通常用于保存超过数据库限制长度…

如何选择科技公司或者技术团队来开发软件项目呢

最近有客户问我们为什么同样软件项目不同公司报价和工期差异很大&#xff0c;我们给他解释好久才讲清楚&#xff0c;今天整理一下打算写一篇文章来总结一下&#xff0c;有需要开发朋友可以参考&#xff0c;我们下次遇到客户也可以直接转发文章给客户自己看。 我们根据我们自己报…

EMR StarRocks实战——Mysql数据实时同步到SR

文章摘抄阿里云EMR上的StarRocks实践&#xff1a;《基于实时计算Flink使用CTAS&CDAS功能同步MySQL数据至StarRocks》 前言 CTAS可以实现单表的结构和数据同步&#xff0c;CDAS可以实现整库同步或者同一库中的多表结构和数据同步。下文主要介绍如何使用Flink平台和E-MapRed…

未来智能:嵌入式系统的创新应用

未来智能&#xff1a;嵌入式系统的创新应用 随着科技的不断进步和智能化的发展&#xff0c;嵌入式系统在各个领域都有着广泛的应用。未来&#xff0c;嵌入式系统将在智能化、自动化、物联网等方面发挥越来越重要的作用。以下将从几个创新应用方面论述嵌入式系统在未来智能领域…

jvm常用参数配置

一、 常用参数 -Xms JVM启动时申请的初始Heap值&#xff0c;默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时&#xff0c;JVM会减小heap的大小到-Xms指定的大小&#xff0c;可通过-XX:MaxHeapFreeRation来指定这个比列。Server端JVM最好将-Xms和-Xmx设为相同…

Java SpringBoot微服务面试题

Java SpringBoot微服务面试题 前言1、什么是 SpringBoot&#xff1f;2、什么是起步依赖&#xff1f;3、什么是自动配置&#xff1f;4、什么是命令行界面&#xff1f;5、什么是Actuator监控器&#xff1f;6、SpringBoot 的核心注解有哪些&#xff1f;7、什么是YAML&#xff1f;8…

Leetcoder Day26| 回溯part06:总结+三道hard题

332.重新安排行程 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…

[C++]使用C++部署yolov9的tensorrt模型进行目标检测

部署YOLOv9的TensorRT模型进行目标检测是一个涉及多个步骤的过程&#xff0c;主要包括准备环境、模型转换、编写代码和模型推理。 首先&#xff0c;确保你的开发环境已安装了NVIDIA的TensorRT。TensorRT是一个用于高效推理的SDK&#xff0c;它能对TensorFlow、PyTorch等框架训…

go - 学习笔记 -2

go - 学习笔记 -2 类型转换运算符输入输出函数输入输出函数应用流程控制语句之分支语句流程控制语句之多分支语句星座案例分支语句嵌套循环语句循环语句和分支语句之间的嵌套for循环的作用域退出循环语句 类型转换 package mainimport ("fmt""reflect"&qu…

【寸铁的刷题笔记】图论、bfs、dfs

【寸铁的刷题笔记】图论、bfs、dfs 大家好 我是寸铁&#x1f44a; 金三银四&#xff0c;图论基础结合bfs、dfs是必考的知识点✨ 快跟着寸铁刷起来&#xff01;面试顺利上岸&#x1f44b; 喜欢的小伙伴可以点点关注 &#x1f49d; &#x1f31e;详见如下专栏&#x1f31e; &…

Java毕业设计-基于springboot开发的漫画之家系统-毕业论文+PPT(有源代码)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、后台模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的漫画之家系统-毕业论…

华为手动ipv6-to-ipv4隧道

中间r2的两个接口配置两个地址就行了&#xff0c;其它什么都不用配置 两边出接口R1和R3手动隧道建立&#xff1a;先把IPV4打通&#xff0c;并配置默认路由 再起隧道接口上进行配置&#xff0c;再配置带隧道的默认路由 PC上和上联接口网关只有IPV6地址 最终两个PC可以ping通 …

Python Web开发记录 Day4:JavaScript

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 四、JavaScript1、JavaScript-基础①JavaScript…

postman访问k8s api

第一种方式&#xff1a; kubectl -n kubesphere-system get sa kubesphere -oyaml apiVersion: v1 kind: ServiceAccount metadata:annotations:meta.helm.sh/release-name: ks-coremeta.helm.sh/release-namespace: kubesphere-systemcreationTimestamp: "2023-07-24T07…

Unity(第十部)时间函数和文件函数

时间函数 using System.Collections; using System.Collections.Generic; using UnityEngine;public class game : MonoBehaviour {// Start is called before the first frame updatefloat timer 0;void Start(){//游戏开始到现在所花的时间Debug.Log(Time.time);//时间缩放值…

Collections常用方法(Java)

Collections常用方法 使用 sort(List<T> list) 对 List 进行排序&#xff1a; List<Integer> numbers new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6)); Collections.sort(numbers); System.out.println("排序后的列表&#xff1a;" …

alembic

alembic是sqlalchemy的作者开发的。 用来做OMR模型与数据库的迁移与映射。 第一个&#xff0c;alembic的所有命令都是以alembic开头 第二&#xff0c;alembic的迁移文件也是通过版本进行控制的。首先&#xff0c;通过pip install alembic进行安装。以下将解释alembic的用法 方…

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范 大家好 我是寸铁&#x1f44a; 总结了一篇测试API查询信息无法返回数据库信息与api、rpc文件编写规范的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 大家好&#xff0c;我是寸铁&#xff01…

ARM系列 -- 虚拟化(四)

今天来看看虚拟中断。 在一个非虚拟化的系统中&#xff0c;操作系统可以直接访问GIC的寄存器&#xff0c;并且处理GIC的物理中断接口&#xff08;physical interrupt interface&#xff09;。 但是在一个虚拟化的系统中&#xff0c;不是这样。Guest OS并不知道它运行在虚拟系…

Apache软件基金会的孵化标准和毕业标准

Apache软件基金会的孵化标准和毕业标准是一个项目成功的重要衡量指标。这些标准关注项目的多个方面&#xff0c;包括开放性、合作性、共建性、透明性、技术可行性、社区建设以及用户基础等。在孵化阶段&#xff0c;Apache软件基金会主要关注项目的开放性和合作性。首先&#xf…