C#双向链表:只用泛型节点类ListNode<T>设计的最短的双向链表包含初始化链表数据和遍历链表各节点

本文主要是介绍C#双向链表:只用泛型节点类ListNode<T>设计的最短的双向链表包含初始化链表数据和遍历链表各节点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、涉及到的知识点:

1.ListNode 类使用自动属性设计

2. 泛型节点类设计的误区

二、仅仅定义泛型节点类,实现最短的双向链表


一、涉及到的知识点:

1.ListNode 类使用自动属性设计

public class ListNode
{public object Object { get; set; }public ListNode? Next { get; set; }public ListNode? Previous { get; set; }public ListNode(object obj){Object = obj;}
}

        或者

 // object是关键字public class ListNode(object obj){public object Object { get; set; } = obj;public ListNode? Next { get; set; }public ListNode? Previous { get; set; }}

        在这个版本中,Object 属性被改为使用 object 类型。同时,构造函数接受一个 object 类型的参数,并将其赋值给 Object 属性。

         上面两种情况,修改为泛型节点类:

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

         或者

/// <summary>
/// 定义双向泛型节点类
/// </summary>
/// <typeparam name="T">泛型标识符</typeparam>
/// <param name="value">泛型参数值</param>
public class ListNode<T>(T value)
{public T Object { get; set; } = value;public ListNode<T>? Next { get; set; }public ListNode<T>? Previous { get; set; }
}

        更改了 Object 和 Next 属性的类型,使用泛型类型参数 T 而不是 Objects 或 ListNode?。这使 ListNode 类更灵活,可以容纳任何类型的对象。 

2. 泛型节点类设计的误区

        以下是二种设计泛型节点类的错误方法,编辑的的时候就显示4个红色的警告错误:CS1001、CS1003、CS1001、CS1525。

public class ListNode<T>(T object)
{public T Object { get; set; } = object;public ListNode<T>? Next { get; set; }public ListNode<T>? Previous { get; set; }
}

        或者

public class ListNode<T>
{public T Object { get; set; }public ListNode<T>? Next { get; set; }public ListNode<T>? Previous { get; set; }public ListNode(T object){Object = object;}
}

        错误的位置在与使用了关键字object:

public ListNode(T object)
{Object = object;
}

        这个构造函数会导致编译器警告,因为它会遮盖 object 关键字。要解决这个问题,你可以将构造函数的参数名称更改为其他名称,例如 value:

public ListNode(T value)
{Object = value;
}

        这样,代码应该可以在 Visual Studio 中编译通过,且没有警告或错误。

二、仅仅定义泛型节点类,实现最短的双向链表

        这段程序很精巧、短小,但是功能不差事,仅仅定义了一个泛型节点类ListNode<T>,就实现了一个双向链表,对链表进行初始化,并遍历链表各节点的数据。

// 只使用自动属性的 ListNode<T> 类
// 不设计链表类,简单实现泛型双向链表
// 遍历输出链表中各节点
namespace _132_2
{/// <summary>/// 定义双向泛型节点类/// </summary>/// <typeparam name="T">泛型标识符</typeparam>/// <param name="value">泛型参数值</param>public class ListNode<T>(T value){public T Object { get; set; } = value;public ListNode<T>? Next { get; set; }public ListNode<T>? Previous { get; set; }}class Program{static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);// 创建元素为5的首个节点ListNode<int> firstNode = new(5);// 创建元素为2的第二个节点,并将其连接到第一个节点ListNode<int> secondNode = new(2);firstNode.Next = secondNode;secondNode.Previous = firstNode;// 创建元素为8的第三个节点,并将其连接到第二个节点ListNode<int> thirdNode = new(8);secondNode.Next = thirdNode;thirdNode.Previous = secondNode;// 创建元素为1的第四个节点,并将其连接到第三个节点ListNode<int> fourthNode = new(1);thirdNode.Next = fourthNode;fourthNode.Previous = thirdNode;// 遍历链表并打印每个元素ListNode<int>? currentNode = firstNode;while (currentNode != null){Console.WriteLine(currentNode.Object);currentNode = currentNode.Next;}}}
}
//运行结果:
/*
5
2
8
1*/

这篇关于C#双向链表:只用泛型节点类ListNode<T>设计的最短的双向链表包含初始化链表数据和遍历链表各节点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py

Python处理超大规模数据的4大方法详解

《Python处理超大规模数据的4大方法详解》在数据的奇妙世界里,数据量就像滚雪球一样,越变越大,从最初的GB级别的小数据堆,逐渐演变成TB级别的数据大山,所以本文我们就来看看Python处理... 目录1. Mars:数据处理界的 “变形金刚”2. Dask:分布式计算的 “指挥家”3. CuPy:GPU

C#实现访问远程硬盘的图文教程

《C#实现访问远程硬盘的图文教程》在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件,这次我们将给出一个完整的... 目录引言一. 远程硬盘功能展示二. 远程硬盘代码实现1. 底层业务通信实现2. UI 实现三. De

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序