/// <summary> /// Обход по всем элементам /// Сложность получения итератора: O(1) /// Сложность обхода коллекции (очевидно): O(n) /// </summary> /// <returns></returns> public IEnumerator <T> GetEnumerator() { ALinkedListNode <T> current = _Head; do { if (current != null) { yield return(current.Value); current = current.Next; } }while (current != _Head); }
/// <summary> /// Удаление элемента /// Сложность: O(n) /// </summary> /// <param name="item"></param> /// <returns></returns> public bool Remove(T item) { ALinkedListNode <T> previous = null; ALinkedListNode <T> current = _Head; if (Count == 0) { return(false); } do { if (current.Value.Equals(item)) { if (previous != null) { previous.Next = current.Next; if (current == _Tail) { _Tail = previous; } } else { if (Count == 1) { _Head = null; _Tail = null; } else { _Head = current.Next; _Tail.Next = _Head; } } Count--; return(true); } previous = current; current = current.Next; }while (current != _Head); return(false); }
/// <summary> /// Добавление элемента в конец списка /// Сложность: O(1), если есть ссылка на последний узел /// Сложность: O(n), если требуется выполнять последовательный доступ к последнему элементу /// </summary> /// <param name="item"></param> public void Add(T item) { var node = new ALinkedListNode <T>(item); if (Count == 0) { _Head = node; _Tail = node; _Tail.Next = _Head; } else { _Tail.Next = node; node.Next = _Head; _Tail = node; } Count++; }
/// <summary> /// Добавление элемента в конец списка /// Сложность: O(1) /// </summary> /// <param name="item"></param> public void Add(T item) { var node = new ALinkedListNode <T>(item); if (_Head == null) { _Head = node; _Head.Next = node; _Head.Previous = node; } else { node.Previous = _Head.Previous; node.Next = _Head; _Head.Previous.Next = node; _Head.Previous = node; } Count++; }
/// <summary> /// Наличие элемента в коллекции /// Сложность: O(n) /// </summary> /// <param name="item"></param> /// <returns></returns> public bool Contains(T item) { ALinkedListNode <T> current = _Head; if (Count == 0) { return(false); } do { if (current.Value.Equals(item)) { return(true); } else { current = current.Next; } }while (current != _Head); return(false); }
/// <summary> /// Удаление элемента /// Сложность: O(n) /// </summary> /// <param name="item"></param> /// <returns></returns> public bool Remove(T item) { var current = _Head; if (Count == 0) { return(false); } do { if (current.Value.Equals(item)) { if (Count == 1) { _Head = null; } else { if (current == _Head) { _Head = _Head.Next; } current.Previous.Next = current.Next; current.Next.Previous = current.Previous; } Count--; return(true); } current = current.Next; }while (current != _Head); return(false); }
public static ALinkedListNode <T> Intersection <T>(this ALinkedListNode <T> sourceList, ALinkedListNode <T> targetList) { throw new NotImplementedException(); }
/// <summary> /// Очистка коллекции /// Сложность: O(1) /// </summary> public void Clear() { _Head = null; _Tail = null; Count = 0; }