public class DEList implements DoubleEndedListInterface{ private Node firstNode; private Node lastNode; private int length; public DEList() { clear(); } // end default constructor public final void clear() //any function called in a constructor must be declared final { firstNode = null; lastNode = null; length = 0; } // end clear public boolean isEmpty() { return (firstNode == null && lastNode == null); } public void display() { Node currentNode = firstNode; while(currentNode != null){ System.out.print(currentNode.data + " "); currentNode = currentNode.next; } System.out.println(); } //Have the class implement the functions shown below: // 1. addFirst(Object newEntry) // 2. addLast(Object newEntry) // 3. getFirst() // 4. removeFirst() // 5. removeLast() // 6. getLast() public void addFirst(Object newEntry) { Node newNode = new Node(newEntry); if (isEmpty()){ firstNode = newNode; lastNode = newNode; } else // add to end of nonempty list { newNode.next = firstNode; firstNode = newNode; } // end if length++; } public void addLast(Object newEntry) { Node newNode = new Node(newEntry); if (isEmpty()){ firstNode = newNode; lastNode = newNode; } else // add to end of nonempty list { lastNode.next = newNode; lastNode = newNode; } // end if length++; } /** Precondition: list is non-empty(). */ public Object removeFirst() { Object result = firstNode.data; if(length == 1){ firstNode = null; lastNode = null; } else{ firstNode = firstNode.next; } length--; return result; } public Object removeLast() { Object result = lastNode.data; if(length == 1){ firstNode = null; lastNode = null; } else{ Node nextToLast = getNodeAt(length-1); nextToLast.next = null; lastNode = nextToLast; } length--; return result; } public Object getFirst() { Object result = firstNode.data; return result; } public Object getLast() { Object result = lastNode.data; return result; } /* < Implementations of the public methods add, remove, replace, getEntry, contains, getLength, isEmpty, isFull, and display go here. > */ // ---------------private!----------------------------- /** Task: Returns a reference to the node at a given position. * Precondition: List is not empty; 1 <= givenPosition <= length. */ private Node getNodeAt(int givenPosition) { Node currentNode = firstNode; // traverse the list to locate the desired node for (int counter = 1; counter < givenPosition; counter++) currentNode = currentNode.next; return currentNode; } // end getNodeAt private class Node // private inner class { private Object data; // data portion private Node next; // link to next node private Node(Object dataPortion) { data = dataPortion; next = null; } // end constructor private Node(Object dataPortion, Node nextNode) { data = dataPortion; next = nextNode; } // end constructor } // end Node }