namespace Xianfen.Net.DataStructure {
internal class SingleLinkedListNode<T> {
private T m_Value;
private SingleLinkedListNode<T> m_Next;
public T Value { get { return m_Value; } set { m_Value = value; } }
public SingleLinkedListNode<T> Next { get { return m_Next; } set { m_Next = value; } }
public SingleLinkedListNode() { m_Next = null; }
public SingleLinkedListNode(T t) : this() { Value = t; }
}
public class SingleLinkedList<T> : ILinearList<T> {
private int m_Count;
private SingleLinkedListNode<T> m_Head;
public SingleLinkedList() { m_Count = 0; m_Head = new SingleLinkedListNode<T>(); }
public SingleLinkedList(T t) : this() { m_Count = 1; m_Head.Next = new SingleLinkedListNode<T>(t); }
public bool IsEmpty { get { return m_Count == 0; } }
public int Count { get { return m_Count; } }
public void Add(T t) { InsertAt(t, this.Count); }
public void AddHead(T t) { InsertAt(t, 0); }
public void AddTail(T t) { Add(t); }
public void InsertAt(T t, int pos) { /* 含邊界檢查、尋找插入點、調整指標 */ }
public void RemoveTail() { RemoveAt(this.Count - 1); }
public void RemoveHead() { RemoveAt(0); }
public void RemoveAt(int pos) { /* 含邊界檢查、尋找前驅節點、調整指標 */ }
public void RemoveAll() { m_Head.Next = null; m_Count = 0; }
public void Clear() { RemoveAll(); }
public T GetHead() { return GetAt(0); }
public T GetTail() { return GetAt(this.Count - 1); }
public T GetAt(int pos) { return GetNodeAt(pos).Value; }
private SingleLinkedListNode<T> GetNodeAt(int pos) { /* 由頭節點向後遍歷 */ }
public void SetAt(int pos, T t) { GetNodeAt(pos).Value = t; }
public int Find(T t) { /* 遍歷比對回傳索引,未找到回傳 -1 */ }
public IEnumerator<T> GetEnumerator() { /* yield return 遍歷 */ }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
}
介面 ILinearList<T> 定義於上一篇。下一篇將介紹雙向鏈結串列。