目录

一、涉及到的知识点:

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{public T Object { get; set; }public ListNode? Next { get; set; }public ListNode? Previous { get; set; }public ListNode(T value){Object = value;}}

或者

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

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

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

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

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

或者

public class ListNode{public T Object { get; set; }public ListNode? Next { get; set; }public ListNode? 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,就实现了一个双向链表,对链表进行初始化,并遍历链表各节点的数据。

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