public NodeWithLink <T> Find(T value) // поиск первого вхождения узла с значением value
        {
            if (First == null)                // список пуст
            {
                return(null);
            }
            NodeWithLink <T> currentNode = First;

            do
            {
                if (currentNode.Value == null) // значение в узле равно null
                {
                    if (value == null)
                    {
                        return(currentNode);
                    }
                }
                else if (currentNode.Value.Equals(value)) // значение в узле равно не null
                {
                    return(currentNode);
                }

                currentNode = currentNode.Next;
            } while (currentNode != First); // перебор циклического списка
            return(null);
        }
        public NodeWithLink <T> AddLast(T value)
        {
            NodeWithLink <T> newNode = new NodeWithLink <T>(value);

            AddLast(newNode);
            return(newNode);
        }
        public NodeWithLink <T> FindLast(T value) // поиск последнего вхождения узла с значением value
        {
            if (First == null)
            {
                return(null);
            }
            NodeWithLink <T> currentNode = First;
            NodeWithLink <T> foundNode   = null;

            do
            {
                if (currentNode.Value == null)
                {
                    if (value == null)
                    {
                        foundNode = currentNode;
                    }
                }
                else if (currentNode.Value.Equals(value))
                {
                    foundNode = currentNode;
                }

                currentNode = currentNode.Next;
            } while (currentNode != First);
            return(foundNode);
        }
        public NodeWithLink <T> AddAfter(NodeWithLink <T> node, T value) // вставка узла с значением value после индентичного узла node в списке
        {
            NodeWithLink <T> newNode = new NodeWithLink <T>(value);

            AddAfter(node, newNode);
            return(newNode);
        }
Пример #5
0
 public bool MoveNext()
 {
     if (first == null) // список пуст
     {
         return(false);
     }
     if (position.Next != first || flag++ == 0)
     {
         position = position.Next;
         return(true);
     }
     return(false);
 }
        public void AddAfter(NodeWithLink <T> node, NodeWithLink <T> newNode)  // вставка узла newNode после индентичного узла node в списке
        {
            // узлы не могут быть null
            if (node == null || newNode == null)
            {
                throw new ArgumentNullException();
            }

            newNode.Next = node.Next;
            node.Next    = newNode;

            if (node == Last) // вставка после последнего узла
            {
                Last = newNode;
            }
            Length++;
        }
        public void AddLast(NodeWithLink <T> node)
        {
            // узел не может быть null
            if (node == null)
            {
                throw new ArgumentNullException();
            }

            if (First == null) // если список пуст
            {
                AddFirst(node);
            }
            else
            {
                Last.Next = node;
                node.Next = First;
                Last      = node;
                Length++;
            }
        }
        public void AddFirst(NodeWithLink <T> node)
        {
            // node cant be null
            if (node == null)
            {
                throw new ArgumentNullException();
            }

            if (First == null) // если список пуст
            {
                First     = node;
                Last      = node;
                Last.Next = node; // начало = конец
            }
            else
            {
                Last.Next = node;
                node.Next = First;
                First     = node;
            }
            Length++;
        }
Пример #9
0
        public void AddFirst(NodeWithLink <T> node)
        {
            // узел не может быть null
            if (node == null)
            {
                throw new NullReferenceException();
            }

            if (First == null) // если список пуст
            {
                First     = node;
                Last      = node;
                Last.Next = node; // начало = конец
            }
            else
            {
                Last.Next = node;
                node.Next = First;
                First     = node;
            }
            Length++;
        }
        public bool Remove(T value) // удаление первого вхождения узла с значением value
        {
            if (First == null)
            {
                return(false);
            }

            NodeWithLink <T> currentNode  = First;
            NodeWithLink <T> previousNode = null;

            do
            {
                if (currentNode.Value == null)
                {
                    if (value == null)
                    {
                        // Если узел в середине или в конце
                        if (previousNode != null)
                        {
                            // убираем узел current, теперь previous ссылается не на current, а на current.Next
                            previousNode.Next = currentNode.Next;

                            // Если узел последний,
                            // изменяем переменную tail
                            if (currentNode == Last)
                            {
                                Last = previousNode;
                            }
                        }
                        else // если удаляется первый элемент
                        {
                            // если в списке всего один элемент
                            if (Length == 1)
                            {
                                First = null;
                                Last  = null;
                            }
                            else
                            {
                                First     = currentNode.Next;
                                Last.Next = First;
                            }
                        }
                        Length--;
                        return(true);
                    }
                }
                else if (currentNode.Value.Equals(value))
                {
                    // Если узел в середине или в конце
                    if (previousNode != null)
                    {
                        // убираем узел current, теперь previous ссылается не на current, а на current.Next
                        previousNode.Next = currentNode.Next;

                        // Если узел последний,
                        // изменяем переменную tail
                        if (currentNode == Last)
                        {
                            Last = previousNode;
                        }
                    }
                    else // если удаляется первый элемент
                    {
                        // если в списке всего один элемент
                        if (Length == 1)
                        {
                            First = null;
                            Last  = null;
                        }
                        else
                        {
                            First     = currentNode.Next;
                            Last.Next = First;
                        }
                    }
                    Length--;
                    return(true);
                }
                previousNode = currentNode;
                currentNode  = currentNode.Next;
            } while (currentNode != First);

            return(false);
        }
 public SaveEventArgs(NodeWithLink <T> node, object data)
 {
     Node = node;
     Data = data;
 }
Пример #12
0
 public void Reset()
 {
     position = last;
 }
Пример #13
0
 int flag = 0; // флаг для начала первой итерации перебора списка
 public LoopSingleLinkListEnumerator(NodeWithLink <T> head, NodeWithLink <T> last)
 {
     this.first    = head;
     this.last     = last;
     this.position = last;
 }