了解集合本质必须要知晓的概念01-链表如果想对集合(系列)有本质的了解,链表是一个必须了解的概念。本篇主要包括:
● 链表的由来和定义● 创建一个单向链表● 其它链表
链表的由来和定义
在现实生活中,我们把不同的商品放在一个购物车中。而在面向对象的世界里,有时候,也需要把不同类型的数据放到一起,组成一个集合。集合中的元素并不是彼此孤立的,在C#中,如何表达集合元素间的关系呢?
借助"自引用类"可以确立集合元素间的关系。比如有这样一个自引用类:
public class Node
{
public int Data{get;set;}
public Node Next{get;set;}
public Node(int dataValue)
{}
}
Node类的最大特点是:存在一个Node类型的属性,这个属性指向Node的另一个实例,Next属性也称为"引用链"。放到集合的场景中来说就是:把多个Node实例放到一个集合中,每一个Node实例包含一个Next属性指向下一个Node实例。而该集合中的最后一个Node实例会指向null。用图表示就是:
链表就是自引用类对象的线性集合,即序列。
由于每个自引用对象是由引用链链接起来,所以叫链表。堆栈与队列是约束版的链表,而二叉查找数是非线性数据结构。
链表的节点或元素虽然在逻辑上是连续的、线性的,当其内存不是连续存储的;数组元素在内存中是连续的,所以我们才可以通过索引来访问数组元素。
创建一个单向链表
首先创建一个节点,是一个自引用类:
namespace LinkedListLibrary
{
public class ListNode
{
//当前节点对象
public object Data { get; PRivate set; }
//Next属性也称为链,指向另一个ListNode对象实例,这样就把2个ListNode对象实例链接起来了
public ListNode Next { get; set; }
public ListNode(object dataValue): this(dataValue, null)
{
}
public ListNode(object dataValue, ListNode nextNode)
{
Data = dataValue;
Next = nextNode;
}
}
}
再模拟一个链表,如下:
namespace LinkedListLibrary
{