本文主要是介绍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>设计的最短的双向链表包含初始化链表数据和遍历链表各节点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!