雙向鏈結清單 每個節點同時擁有前驅與後繼指標,支援雙向遍歷與高效率插入/刪除。以下提供完整 C# 實作與測試代碼。
public class Node {
public object Element;
public Node FLink; // 後繼
public Node BLink; // 前驅
public Node() : this(null) { }
public Node(object element) {
Element = element;
FLink = BLink = null;
}
}
public class LinkedList {
public Node Header; // 標頭節點,不存放資料
public LinkedList() {
Header = new Node("Header");
Header.FLink = Header.BLink = null;
}
// 查找節點
private Node Find(object item) {
Node current = Header;
while (current.Element != item) current = current.FLink;
return current;
}
// 插入節點於 positionItem 之後
public void InsertNode(object item, object positionItem) {
Node current = Find(positionItem);
if (current != null) {
Node newNode = new Node(item);
newNode.FLink = current.FLink;
newNode.BLink = current;
current.FLink = newNode;
if (newNode.FLink != null) newNode.FLink.BLink = newNode;
}
}
// 刪除節點
public void Remove(object item) {
Node p = Find(item);
if (p.FLink != null) {
p.BLink.FLink = p.FLink;
p.FLink.BLink = p.BLink;
p.FLink = p.BLink = null;
}
}
// 正向列印
public void Print() {
Node current = Header;
while (current.FLink != null) {
Console.WriteLine(current.FLink.Element);
current = current.FLink;
}
}
// 反向列印
public void PrintReverse() {
Node current = Header;
while (current.FLink != null) current = current.FLink; // 移至尾端
while (current.BLink != null) {
Console.WriteLine(current.Element);
current = current.BLink;
}
}
}
static void Main(string[] args) {
LinkedList list = new LinkedList();
// 手動建立初始鏈結
Node n1 = new Node("Tommy");
Node n2 = new Node("Wei");
Node n3 = new Node("Chencaixia");
Node n4 = new Node("weiwei");
list.Header.FLink = n1; n1.BLink = list.Header;
n1.FLink = n2; n2.BLink = n1;
n2.FLink = n3; n3.BLink = n2;
n3.FLink = n4; n4.BLink = n3; n4.FLink = null;
list.InsertNode("test", "Chencaixia");
list.Remove("Wei");
list.Print();
Console.ReadLine();
}
Header Tommy Chencaixia test weiwei