链表是一种有序的列表,它的内容通常存储与内容分散的位置上。
一般链表的串联方式有两种:
一种是通过数组有序串联链表的列表元素,通常用到两个数组,一个数组存放数据,一个数组存放链接的关系。这种链表的缺点在于,在插于或者删除元素的时候,要频繁的搬动元素,而且数组的大小是固定的,使用缺乏弹性。
另一种则是动态内存配置的链表,它由许多的结点(Node)链接而成,每一个结点包含数据部分以及指向下一个结点的指针(引用)。
我们常说的“链表”一般就是指第二种。
.Net Framework里并没有加入链表的数据结构对象。所以我就自己动手实践了一下。
偶尔看到韩睿的“.NET数据结构对象补遗之单链表”,我没有看他后面的代码部分(他用的是VB.NET),我也来写一个单链表的类。
上面讲了,链表由许多个结点链接而成,那首先,我们要考虑的就是创建一个链表结点的类。
首先,一个结点应该有两个域,一个域用来存放数据,一个域则存放指向下一个结点的引用。


2

3

4

5



6


7

8

9

10

11


12


13

14

15

16



17



18



19

20

21


22

23

24

25



26



27



28

29

30

31


32


33

34

35

36

37

38



39

40

41

42

43


44

45

46

47

48



49

50

51

接下来,要考虑的就是创建一个链表类。先考虑一下链表类需要提供哪些操作。
首先,通过位置(索引)获取到对链表中的数据的访问,这对于列表数据结构而言是基本的实现内容,同样,针对链表元素的数据项的所在位置的索引,也是我们需要提供的实现方法之一。
昨天写了篇数组的东西,里面就说到数组的增、删、排效率很低,因为要频繁移动存储位置。而链表作为一种动态内存分配的列表数据结构,在添加、删除、排序方面没有了数组的先天不足,所以添加、删除、排序这几个方法肯定需要在我的这个链表类中得以实现。
从上面这些我首先想到的就是链表类可以从IList继承而来,IList是所有列表对象的抽象基类,也就是所有的列表对象都实现了System.Collections.IList这个接口。除了排序,上面提到的需要实现的方法在IList中都有定义。
同时在这里,我把刚才前面定义的那个结点类作为Nested Class内嵌在链表内中,提升这个结构的聚合性。

2

3

4



5

6



7


8

9

在开始为链表类的方法作具体实现之前,先定义几个基本的成员;


2

3

4

5

6


7

8

9

10

11


12

13

14

以及一些基本的内部调用,比如验证结点的有效性,根据结点索引或数据内容查找结点等。


2

3

4

5

6



7

8



9

10

11

12

13


14

15

16

17

18



19

20



21

22

23

24

25


26

27

28

29

30

31



32

33

34

35

36


37

38

39

40

41

42



43

44

45

46

47

48

49

50

51



52

53



54

55

56
