1. a. Write a method "keep" for our LinkedList class that takes a number (howMany) and keeps the first howMany items in the LinkedList, i.e., makes the list of length howMany. If the list has less than howMany items, nothing changes. You can assume we're using the singly linked list with just a head reference. public void keep(int howMany) b. What is the worst-case big-O runtime of your method? c. Could you write this method more efficiently (with respect to worst-case big-O) runtime if you had a tail reference? You don't need to write the code, just state whether it would help and give a brief justification. d. Could you write this method more efficiently (with respect to worst-case big-O) runtime if you had a tail reference and it was a doubly linked list? You don't need to write the code, just state whether it would help and give a brief justification. 2. Which of the following things could be done fast (O(1)) in the worst case on an ArrayList: - Remove the first thing from the list - Remove the last thing from the list - Remove a value at a particular index in the list - Swap two values in the list, given their indices - Remove all items from the list, i.e., clear the list (justify your answer for this one) 3. Which of the following things could be done fast (O(1)) in the worst case on a singly LinkedList with a tail reference: - Remove the first thing from the list - Remove the last thing from the list - Remove a value at a particular index in the list - Swap two values in the list, given their indices - Remove all items from the list, i.e., clear the list.