예제 #1
0
 public PrioritySingleLinkedList(Func <T, T, bool> comparer, IOrderedEnumerable <T> collection)
 {
     this.comparer = comparer;
     save          = new SingleLinkedList <T>();
     foreach (T item in collection)
     {
         SingleNodeData <T> temp = new SingleNodeData <T>(item);
         if (save.Count == 0)
         {
             save.AddFirst(temp);
         }
         else
         {
             int index = save.CustomBinarySearch(temp, 0, save.Count, (x, y) =>
             {
                 if (comparer(x.data, y.data))
                 {
                     return(-1);
                 }
                 else
                 {
                     return(1);
                 }
             });
             save.AddAfter(index, temp);
         }
     }
 }
 public void AddFirst(SingleNodeData <T> node)
 {
     node.Next = begin;
     begin     = node;
     if (_size == 0)
     {
         end = node;
     }
     _size++;
 }
 public void AddLast(SingleNodeData <T> node)
 {
     end.Next  = node;
     end       = node;
     node.Next = null;
     if (_size == 0)
     {
         begin = node;
     }
     _size++;
 }
 public bool MoveNext()
 {
     if (index >= 0)
     {
         currentItem = currentItem.Next;
     }
     index++;
     if (currentItem == null)
     {
         return(false);
     }
     return(true);
 }
        public SingleNodeData <T> AddLast(T value)
        {
            SingleNodeData <T> node = new SingleNodeData <T>(value);

            end.Next = node;
            end      = node;
            if (_size == 0)
            {
                begin = node;
            }
            _size++;
            return(node);
        }
        public SingleNodeData <T> AddFirst(T value)
        {
            SingleNodeData <T> node = new SingleNodeData <T>(value);

            node.Next = begin;
            begin     = node;
            if (_size == 0)
            {
                end = node;
            }
            _size++;
            return(node);
        }
        public SingleNodeData <T> Find(T value)
        {
            SingleNodeData <T> pTemp = begin;

            while (pTemp != null)
            {
                if (pTemp.data.Equals(value))
                {
                    return(pTemp);
                }
                pTemp += 1;
            }
            return(null);
        }
        public SingleNodeData <T> FindLast(T value)
        {
            SingleNodeData <T> pTemp  = begin;
            SingleNodeData <T> result = null;

            while (pTemp != null)
            {
                if (pTemp.data.Equals(value))
                {
                    result = pTemp;
                }
                pTemp += 1;
            }
            return(result);
        }
        public SingleLinkedList(IEnumerable <T> collection)
        {
            begin = new SingleNodeData <T>(collection.ElementAt(0));
            SingleNodeData <T> pNext = begin;
            int count = collection.Count();

            for (int i = 1; i < count; i++)
            {
                SingleNodeData <T> next = new SingleNodeData <T>(collection.ElementAt(i));
                pNext.Next = next;
                pNext      = next;
            }
            end   = pNext;
            _size = count;
        }
 public SingleNodeData <T> this[int index]
 {
     get
     {
         if (_size <= index || index < 0)
         {
             throw new IndexOutOfRangeException();
         }
         SingleNodeData <T> result = begin;
         for (int i = 0; i < index; i += 1)
         {
             result = result.Next;
         }
         return(result);
     }
 }
        public void AddBefore(int index, SingleNodeData <T> node)
        {
            if (index >= _size || index < 0)
            {
                throw new ArgumentOutOfRangeException();
            }
            SingleNodeData <T> pTemp = begin;

            for (int i = 1; i <= index; i++)
            {
                pTemp++;
            }
            SingleNodeData <T> next = pTemp.Next;

            pTemp.Next = node;
            node.Next  = next;
        }
        public SingleNodeData <T> AddAfter(int index, T value)
        {
            if (index >= _size || index < 0)
            {
                throw new ArgumentOutOfRangeException();
            }
            SingleNodeData <T> pTemp = begin;

            for (int i = 1; i < index; i++)
            {
                pTemp++;
            }
            SingleNodeData <T> node = new SingleNodeData <T>(value);
            SingleNodeData <T> next = pTemp.Next;

            pTemp.Next = node;
            node.Next  = next;
            return(node);
        }
 public void Concat(SingleLinkedList <T> nodeList)
 {
     this.end.Next = nodeList.begin;
     this.end      = nodeList.end;
     _size        += nodeList.Count;
 }
 public void Reset()
 {
     currentItem = null;
 }
 public SingleLinkedListEnumerator(SingleLinkedList <T> list)
 {
     this.list   = list;
     index       = -1;
     currentItem = list.begin;
 }
 public SingleLinkedList()
 {
     begin = end = null;
     _size = 0;
 }