Beispiel #1
0
        public bool TryAdd(T x)
        {
            if (_items.ContainsKey(x))
            {
                return(false);
            }

            var item = new DoublyLinkedItem <T>(x);

            _items.Add(x, item);
            if (FirstItem == null)
            {
                AddAtBegin(item);
                return(true);
            }

            if (item.Value.CompareTo(FirstItem.Value) >= 0)
            {
                AddAtBegin(item);
            }
            else
            {
                AddAtEnd(item);
                AdjustPosition(item);
            }

            return(true);
        }
Beispiel #2
0
        public void AddAtEnd(T x)
        {
            if (_items.ContainsKey(x))
            {
                return;
            }
            var item = new DoublyLinkedItem <T>(x);

            _items.Add(x, item);
            AddAtEnd(item);
            AdjustPosition(item);
        }
Beispiel #3
0
        private void AddAtBegin(DoublyLinkedItem <T> item)
        {
            Count++;
            if (FirstItem == null)
            {
                FirstItem = item;
                LastItem  = item;
                return;
            }

            item.Right     = FirstItem;
            FirstItem.Left = item;
            FirstItem      = item;
        }
Beispiel #4
0
        private void Remove(DoublyLinkedItem <T> item)
        {
            if (item == FirstItem)
            {
                ExtractFirstItem();
                return;
            }

            if (item == LastItem)
            {
                ExtractLastItem();
                return;
            }

            Count--;
            var left  = item.Left;
            var right = item.Right;

            left.Right = right;
            right.Left = left;
        }
Beispiel #5
0
        private void AdjustPosition(DoublyLinkedItem <T> item)
        {
            while (item.Right != null && item.Value.CompareTo(item.Right.Value) < 0)
            {
                if (item.Right == null)
                {
                    return;
                }

                var right = item.Right;
                var left  = item.Left;
                if (FirstItem == item)
                {
                    FirstItem = right;
                }
                item.Right = right.Right;
                item.Left  = right;
                if (item.Right != null)
                {
                    item.Right.Left = item;
                }

                right.Right = item;
                right.Left  = left;

                if (left != null)
                {
                    left.Right = right;
                }
                if (item.Right == null)
                {
                    LastItem = item;
                }
            }

            while (item.Left != null && item.Value.CompareTo(item.Left.Value) > 0)
            {
                var right = item.Right;
                var left  = item.Left;
                if (LastItem == item)
                {
                    LastItem = left;
                }
                item.Right = left;
                item.Left  = left.Left;
                if (left.Left != null)
                {
                    left.Left.Right = item;
                }

                left.Right = right;
                left.Left  = item;

                if (right != null)
                {
                    right.Left = left;
                }
                if (item.Left == null)
                {
                    FirstItem = item;
                }
            }
        }
Beispiel #6
0
 public DoublyLinkedItem(T value)
 {
     Value = value;
     Left  = null;
     Right = null;
 }