Пример #1
0
 //Return node at the given index
 public dNode <T> GetNode(int index)
 {
     if (index < 0 || index >= size)
     {
         throw new System.ArgumentException("Index out of bounds", "original");
     }
     else if (index == 0)
     {
         return(head);
     }
     else if (index == size - 1)
     {
         return(tail);
     }
     else
     {
         dNode <T> positionNode = head;
         int       position     = 0;
         while (position != index)
         {
             positionNode = positionNode.next;
             position    += 1;
         }
         return(positionNode);
     }
 }
Пример #2
0
        //Insert element into the end of the DLL
        public void InsertTail(T value)
        {
            dNode <T> newNode = new dNode <T>(value);

            if (size == 0)
            {
                head = newNode;
                tail = head;
            }
            else
            {
                newNode.prev = tail;
                tail.next    = newNode;
                tail         = newNode;
            }
            size += 1;
        }
Пример #3
0
        //Insert element into the beginning of DLL
        public void InsertHead(T value)
        {
            dNode <T> newNode = new dNode <T>(value);

            if (size == 0)
            {
                head = newNode;
                tail = head;
            }
            else
            {
                newNode.next = head;
                head.prev    = newNode;
                head         = newNode;
            }
            size += 1;
        }
Пример #4
0
 //Delete element located at the given index. Throws exception if element is out of range.
 public void DeleteAtIndex(int index)
 {
     if (index < 0 || index >= size)
     {
         throw new System.ArgumentException("Index out of bounds", "original");
     }
     else if (size == 1)
     {
         head  = null;
         tail  = null;
         size -= 1;
     }
     else if (index == 0)
     {
         head      = head.next;
         head.prev = null;
         size     -= 1;
     }
     else
     {
         dNode <T> positionNode = head;
         int       position     = 0;
         while (position != index)
         {
             positionNode = positionNode.next;
             position    += 1;
         }
         dNode <T> nextNode = positionNode.next;
         dNode <T> prevNode = positionNode.prev;
         //Delete at middle
         if (nextNode != null)
         {
             prevNode.next = nextNode;
             nextNode.prev = prevNode;
             positionNode  = null;
         }
         //Delete at tail
         else
         {
             prevNode.next = null;
             positionNode  = null;
         }
         size--;
     }
 }
Пример #5
0
        private int Partition(int begin, int end)
        {
            dNode <T> pivot = GetNode(end);

            int i = begin - 1;

            for (int j = begin; j < end; j++)
            {
                if (GetNode(j).GetValue().CompareTo(pivot.GetValue()) < 0)
                {
                    i++;
                    Swap(i, j);
                }
            }
            Swap(i + 1, end);

            return(i + 1);
        }
Пример #6
0
        //Insert element T into certain position of the DLL. Throws exception if element is out of range.
        public void InsertAtIndex(int index, T value)
        {
            dNode <T> newNode      = new dNode <T>(value);
            dNode <T> positionNode = head;
            int       position     = 0;

            if (index < 0 || index > size)
            {
                throw new System.ArgumentException("Index out of bounds", "original");
            }
            else if (size == 0)
            {
                head  = newNode;
                tail  = head;
                size += 1;
            }
            else if (index == 0)
            {
                InsertHead(value);
            }
            else if (index == size)
            {
                InsertTail(value);
            }
            else
            {
                while (position != index)
                {
                    positionNode = positionNode.next;
                    position    += 1;
                }
                dNode <T> prevNode = positionNode.prev;
                prevNode.next     = newNode;
                positionNode.prev = newNode;
                newNode.next      = positionNode;
                newNode.prev      = prevNode;
                size += 1;
            }
        }
Пример #7
0
 public DoublyLinkedList(T value)
 {
     head = new dNode <T>(value);
     tail = head;
     size = 1;
 }
Пример #8
0
 //Constructors for DoublyLinkedList
 public DoublyLinkedList()
 {
     head = null;
     tail = null;
     size = 0;
 }
Пример #9
0
        //Swap two elements in the DLL
        public void Swap(int first, int second)
        {
            //If one of the elements is out of range throw exception
            if (first < 0 || second < 0 || first >= size || second >= size)
            {
                throw new System.ArgumentException("Index out of bounds", "original");
            }
            //If elements are equal no swap required
            else if (first != second)
            {
                dNode <T> firstNode  = GetNode(first);
                dNode <T> secondNode = GetNode(second);
                dNode <T> temp       = new dNode <T>(firstNode.GetValue());
                temp.next = firstNode.next;
                temp.prev = firstNode.prev;

                //If elements are consecutive
                if (firstNode.prev == secondNode)
                {
                    if (secondNode.prev != null)
                    {
                        if (firstNode.next != null)
                        {
                            firstNode.next.prev = secondNode;
                        }
                        firstNode.prev       = secondNode.prev;
                        secondNode.prev.next = firstNode;
                        secondNode.next      = firstNode.next;
                        secondNode.prev      = firstNode;
                        firstNode.next       = secondNode;
                    }
                    else
                    {
                        if (firstNode.next != null)
                        {
                            firstNode.next.prev = secondNode;
                        }
                        secondNode.next = firstNode.next;
                        secondNode.prev = firstNode;
                        firstNode.next  = secondNode;
                        firstNode.prev  = null;
                        head            = firstNode;
                    }
                }
                else if (firstNode.next == secondNode)
                {
                    Swap(second, first);
                }
                //If elements are different
                else
                {
                    if (firstNode.prev != null)
                    {
                        dNode <T> firstPrev = firstNode.prev;
                        firstPrev.next = secondNode;
                    }
                    else
                    {
                        head = secondNode;
                    }

                    if (firstNode.next != null)
                    {
                        dNode <T> firstNext = firstNode.next;
                        firstNext.prev = secondNode;
                    }
                    else
                    {
                        tail = secondNode;
                    }
                    if (secondNode.prev != null)
                    {
                        dNode <T> secondPrev = secondNode.prev;
                        secondPrev.next = firstNode;
                    }
                    else
                    {
                        head = firstNode;
                    }

                    if (secondNode.next != null)
                    {
                        dNode <T> secondNext = secondNode.next;
                        secondNext.prev = firstNode;
                    }
                    else
                    {
                        tail = firstNode;
                    }

                    firstNode.next  = secondNode.next;
                    firstNode.prev  = secondNode.prev;
                    secondNode.next = temp.next;
                    secondNode.prev = temp.prev;
                }
            }
        }
Пример #10
0
 public dNode(T value)
 {
     val  = value;
     next = null;
     prev = null;
 }