在C#中,雙向鏈表是一種數據結構,它包含兩個指針,一個指向前一個節點,另一個指向后一個節點。為了實現一個具有擴展性的雙向鏈表,我們可以使用泛型和接口。這樣,我們可以輕松地為不同的數據類型和場景創建自定義的雙向鏈表。
首先,我們需要創建一個表示鏈表節點的類:
public class DoublyLinkedListNode<T>
{
public T Value { get; set; }
public DoublyLinkedListNode<T> Previous { get; set; }
public DoublyLinkedListNode<T> Next { get; set; }
public DoublyLinkedListNode(T value)
{
Value = value;
}
}
接下來,我們需要創建一個表示雙向鏈表的接口:
public interface IDoublyLinkedList<T>
{
void AddFirst(T value);
void AddLast(T value);
bool Remove(T value);
bool Contains(T value);
int Count { get; }
}
現在,我們可以實現這個接口,創建一個具體的雙向鏈表類:
public class DoublyLinkedList<T> : IDoublyLinkedList<T>
{
private DoublyLinkedListNode<T> _head;
private DoublyLinkedListNode<T> _tail;
private int _count;
public int Count => _count;
public void AddFirst(T value)
{
var newNode = new DoublyLinkedListNode<T>(value);
if (_head == null)
{
_head = newNode;
_tail = newNode;
}
else
{
newNode.Next = _head;
_head.Previous = newNode;
_head = newNode;
}
_count++;
}
public void AddLast(T value)
{
var newNode = new DoublyLinkedListNode<T>(value);
if (_tail == null)
{
_head = newNode;
_tail = newNode;
}
else
{
newNode.Previous = _tail;
_tail.Next = newNode;
_tail = newNode;
}
_count++;
}
public bool Remove(T value)
{
var currentNode = _head;
while (currentNode != null)
{
if (currentNode.Value.Equals(value))
{
if (currentNode.Previous != null)
{
currentNode.Previous.Next = currentNode.Next;
}
else
{
_head = currentNode.Next;
}
if (currentNode.Next != null)
{
currentNode.Next.Previous = currentNode.Previous;
}
else
{
_tail = currentNode.Previous;
}
_count--;
return true;
}
currentNode = currentNode.Next;
}
return false;
}
public bool Contains(T value)
{
var currentNode = _head;
while (currentNode != null)
{
if (currentNode.Value.Equals(value))
{
return true;
}
currentNode = currentNode.Next;
}
return false;
}
}
現在,我們已經創建了一個具有擴展性的雙向鏈表實現。你可以根據需要為不同的數據類型和場景創建自定義的雙向鏈表。例如,你可以為整數、字符串或自定義對象創建雙向鏈表。