在C#中,面對鏈表的場景可使用LinkedList
,LinkedList
可以被看作是一個集合,集合元素的類型為LinkedListNode
,與其他集合元素不同的是:LinkedListNode
不僅存儲本身的值,還包含對上一個節點、下一個節點的引用。反編譯LinkedListNode
可以看到大致如下:
public sealed class LinkedListNode<T>{internal T item;internal LinkedListNode<T> next;internal LinkedListNode<T> prev;......}
使用LinkedList
如下:
static void Main(string[] args){LinkedList<string> strs = new LinkedList<string>();strs.AddFirst("b");strs.AddFirst("a");foreach (var item in strs){Console.Write(item + " ");}Console.ReadKey();}
以上,LinkedList
中每個LinkedListNode
節點的數據類型都是LinkedListNode
,可是,如果作為鏈表節點的LinkedListNode
數據類型不一樣,怎麼辦呢?
我們來自定義一個鏈表的節點,使之能接收不同類型的數據。在自定義鏈表節點中,每個節點的數據類型可能是不一樣的,但在該鏈表節點中有關指向下一個鏈表節點的屬性類型是一樣的,可以先提煉出一個鏈表節點基類:
public class Node{protected Node _next;public Node(Node next){_next = next;}}
代表鏈表節點的泛型類實現該基類。
public class MyNode<T> : Node{public T _data;public MyNode(T data, Node next) : base(next){_data = data;}public MyNode(T data) : this(data, null){}public override string ToString(){return _data.ToString() + " " + ((_next != null) ? _next.ToString() : "");}}
在客戶端這樣調用:
static void Main(string[] args){Node node = new MyNode<DateTime>(DateTime.Now);node = new MyNode<string>("現在的時間是", node);Console.WriteLine(node.ToString());Console.ReadKey();}
總結:泛型類也是類,可以派生與某個具體類。以上,借助MyNode
實現接收不同數據類型,通過MyNode
的父類Node
實現對下一個節點引用的抽象。