示例#1
0
        public void AddLast(LoopNode <T> node)
        {
            size++;

            if (first == null)
            {
                first = node;
            }

            if (last == null)
            {
                last = node;
            }

            node.previous = last;
            node.next     = first;

            first.previous = node;
            last.next      = node;
            last           = node;
        }
示例#2
0
        public void InsertAfter(LoopNode <T> node, T value)
        {
#if DEBUG
            if (node.list != this)
            {
                throw new InvalidOperationException("'node' should be of the same list");
            }
#endif

            size++;

            var newNode = new LoopNode <T>(this, value);
            if (last == node)
            {
                last = newNode;
            }

            newNode.previous   = node;
            newNode.next       = node.next;
            node.next.previous = newNode;
            node.next          = newNode;
        }
示例#3
0
        public void AddFirst(T value)
        {
            size++;
            var node = new LoopNode <T>(this, value);

            if (first == null)
            {
                first = node;
            }

            if (last == null)
            {
                last = node;
            }

            node.previous = last;
            node.next     = first;

            first.previous = node;
            last.next      = node;
            first          = node;
        }
示例#4
0
        public void InsertAfter(LoopNode <T> position, LoopNode <T> nodeFrom, LoopNode <T> nodeTo)
        {
#if DEBUG
            if (position.list != this)
            {
                throw new ArgumentException("position argument must belong to current colliction");
            }

            if (nodeFrom.list == this)
            {
                throw new ArgumentException("nodeFrom argument must not belong to current colliction");
            }

            if (nodeFrom.list != nodeTo.list)
            {
                throw new ArgumentException("nodeFrom and nodeTo arguments must belong to the same colliction");
            }
#endif

            var node    = nodeFrom;
            int counter = 1;
            for (; ;)
            {
                if (node == nodeTo)
                {
                    break;
                }

                if (counter > node.list.size)
                {
                    throw new InvalidOperationException();
                }

                node = node.next;
                ++counter;
            }

            var otherList = nodeFrom.list;
            size           += counter;
            otherList.size -= counter;

            if (otherList.size == 0)
            {
                otherList.first = null;
                otherList.last  = null;
            }
            else
            {
                throw new InvalidOperationException("Not full utilization is not supportet now.");
            }

            if (position == last)
            {
                last = nodeTo;
            }

            var posNext = position.next;
            position.next     = nodeFrom;
            posNext.previous  = nodeTo;
            nodeFrom.previous = position;
            nodeTo.next       = posNext;

            node = nodeFrom;
            for (; ;)
            {
                node.list = this;

                if (node == nodeTo)
                {
                    break;
                }

                node = node.next;
            }
        }
示例#5
0
        public void AddLast(T value)
        {
            var node = new LoopNode <T>(this, value);

            AddLast(node);
        }