private ElementNode<E> getNode(int index) {

        if (this.isEmpty()) {
            throw new ArrayIndexOutOfBoundsException();
        }

        if (index < 0 || index >= this.getSize()) {
            throw new ArrayIndexOutOfBoundsException();
        }

        ElementNode<E> currentNode;

        if (index <= (this.getSize() / 2)) {

            currentNode = this.head;

            for (int i = 0; i < index; i++) {
                if (currentNode.hasNextNode()) {
                    currentNode = currentNode.getNextNode();
                } else {
                    throw new ArrayIndexOutOfBoundsException();
                }
            }

        } else {
            currentNode = this.tail;

            for (int i = this.getSize() - 1; i > index; i--) {
                if (currentNode.hasPrevNode()) {
                    currentNode = currentNode.getPrevNode();
                } else {
                    throw new ArrayIndexOutOfBoundsException();
                }
            }

        }

        return currentNode;
    }