在當前節點之前插入新節點,需處理三種情況:空表、頭部插入、中間插入。雙向鏈表結構下需維護Previous與Next雙向指針。
/// 在當前位置前插入數據
public void Insert(int DataValue)
{
var newNode = new ListNode(DataValue);
if (IsNull())
{
Append(DataValue);
return;
}
if (IsBOF()) // 頭部插入
{
newNode.Next = Head;
Head.Previous = newNode;
Head = newNode;
Current = Head;
ListCountValue++;
return;
}
// 中間插入
newNode.Next = Current;
newNode.Previous = Current.Previous;
Current.Previous.Next = newNode;
Current.Previous = newNode;
Current = newNode;
ListCountValue++;
}
維持鏈表非遞減有序:
/// 升序插入
public void InsertAscending(int InsertValue)
{
if (IsNull()) { Append(InsertValue); return; }
MoveFirst();
if (InsertValue < GetCurrentValue()) { Insert(InsertValue); return; }
while (true)
{
if (InsertValue < GetCurrentValue()) { Insert(InsertValue); break; }
if (IsEOF()) { Append(InsertValue); break; }
MoveNext();
}
}
Current指針在插入後指向新節點,便於連續操作。IComparer<T>支援泛型類型。