Simple Queue Implementation
while (currentNode.previous != null) {
                currentNode = currentNode.previous;
            }

            currentNode.previous = nodeToInsert;



You can avoid this iteration if you track the location of the tail element.  

            tail.previous = nodeToInsert;
            tail = tail.previous;


Of course, you have to maintain the tail in other places as well.  

    private Node&lt;T&gt; tail;

    public void enqueue(T data) {
        Node&lt;T&gt; nodeToInsert = new Node&lt;&gt;(data, null);

        if (isEmpty()) {
            head = nodeToInsert;
        } else {
            tail.previous = nodeToInsert;
        }

        tail = nodeToInsert;
    }


But you no longer have to iterate this way.  

Since both branches update tail, I moved that out of the if/else.  

I notice that you use this. to specify object fields.  That actually isn't necessary unless there is a conflict with a parameter or local variable.  Of course, if you simply prefer it that way to make it obvious which variables are object fields, you can.  

You can also update the tail when you dequeue to an empty queue, but you don't need to do so for functionality.  It does allow the garbage collector to collect the node though.