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

目录

一、涉及到的知识点:

[1.ListNode 类使用自动属性设计](#1.ListNode 类使用自动属性设计)

[2. 泛型节点类设计的误区](#2. 泛型节点类设计的误区)

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


一、涉及到的知识点:

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

cs 复制代码
public class ListNode
{
    public object Object { get; set; }
    public ListNode? Next { get; set; }
    public ListNode? Previous { get; set; }
    public ListNode(object obj)
    {
        Object = obj;
    }
}

或者

cs 复制代码
 // 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 属性。

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

cs 复制代码
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;
    }
}

或者

cs 复制代码
/// <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。

cs 复制代码
public class ListNode<T>(T object)
{
    public T Object { get; set; } = object;
    public ListNode<T>? Next { get; set; }
    public ListNode<T>? Previous { get; set; }
}

或者

cs 复制代码
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:

cs 复制代码
public ListNode(T object)
{
    Object = object;
}

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

cs 复制代码
public ListNode(T value)
{
    Object = value;
}

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

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

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

cs 复制代码
// 只使用自动属性的 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

*/
相关推荐
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ16 分钟前
如何使用Java WebSocket API实现客户端和服务器端的通信?
java·开发语言·websocket
Shartin22 分钟前
Can201-Introduction to Networking: Application Layer应用层
服务器·开发语言·php
共享家95271 小时前
linux_线程概念
linux·开发语言·jvm
apihz1 小时前
VM虚拟机全版本网盘+免费本地网络穿透端口映射实时同步动态家庭IP教程
android·服务器·开发语言·网络·数据库·网络协议·tcp/ip
tanyongxi662 小时前
C++ Map 和 Set 详解:从原理到实战应用
开发语言·c++
飒飒真编程3 小时前
C++类模板继承部分知识及测试代码
开发语言·c++·算法
CodeCraft Studio3 小时前
PPT处理控件Aspose.Slides教程:使用 C# 将 PPTX 转换为 EMF
c#·powerpoint·ppt·aspose·ppt格式转换
博睿谷IT99_3 小时前
华为数据通信网络基础
开发语言·华为·php·华为认证
蓝桉(努力版)4 小时前
MATLAB可视化5:华夫图(饼图的平替可以表示种类的分布,附有完整代码详细讲解)(求个关注、点赞和收藏)(对配色不满意可以自己调节配色,附调色教程)
开发语言·数学建模·matlab·信息可视化·matlab可视化
艾莉丝努力练剑4 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(五)
c语言·开发语言·数据结构·学习·算法