鏈結清單是基礎資料結構,本文實作雙向鏈結清單(含前後指標),涵蓋節點定義、新增、刪除、插入、搜尋、排序插入等核心操作。
public class ListNode {
public ListNode(int newValue) { Value = newValue; }
public ListNode Previous; // 前一節點
public ListNode Next; // 後一節點
public int Value; // 節點資料
}
維護 Head、Tail、Current 三指標與節點計數:
public class Clist {
private ListNode Head, Tail, Current;
private int ListCountValue;
public Clist() { Head = Tail = Current = null; ListCountValue = 0; }
// ... 核心方法如下
}
public void Append(int dataValue) {
ListNode newNode = new ListNode(dataValue);
if (IsNull()) { Head = Tail = newNode; }
else { Tail.Next = newNode; newNode.Previous = Tail; Tail = newNode; }
Current = newNode; ListCountValue++;
}
public void Delete() {
if (IsNull()) return;
if (IsBof()) { Head = Current.Next; Current = Head; }
else if (IsEof()) { Tail = Current.Previous; Current = Tail; }
else { Current.Previous.Next = Current.Next; Current = Current.Previous; }
ListCountValue--;
}
public void MoveNext() { if (!IsEof()) Current = Current.Next; }
public void MovePrevious() { if (!IsBof()) Current = Current.Previous; }
public void MoveFirst() { Current = Head; }
public void MoveLast() { Current = Tail; }
public bool IsNull() { return ListCountValue == 0; }
public bool IsEof() { return Current == Tail; }
public bool IsBof() { return Current == Head; }
public void InsertAscending(int value) {
if (IsNull()) { Append(value); return; }
MoveFirst();
if (value < GetCurrentValue()) { Insert(value); return; }
while (true) {
if (value < GetCurrentValue()) { Insert(value); break; }
if (IsEof()) { Append(value); break; }
MoveNext();
}
}
InsertUnAscending 邏輯類似,比較方向相反。
GetCurrentValue():取得目前節點值ListCount:取得節點總數Clear():從頭刪除至空Insert():目前位置前插入此實作展示雙向鏈結清單靈活的節點操作能力,為理解 .NET 內建 LinkedList<T> 奠定基礎。