MyLinkedList java Programming Project.
Implement Two Way Linked List Due: Midnight, November 10, 2021. The MyLinkedList class is a one-way directional linked list that enables one-way traversal of the list. MyLinkedList.java is attached in a separate file. Modify the Node class to add the new field named previous to refer to the previous node in the list, as follows: public class Node { E element; Node next; Node previous; public Node(E e) { element = e; } } Implement a new class named MyTwoWayLinkedList that uses a double linked list to store elements. The MyLinkedList class in the text extends MyList. Define MyTwoWayLinkedList to extend the java.util.AbstractSequentialList class. You can find methods of AbstractSequentialList from this article: https://www.geeksforgeeks.org/abstractsequentiallist-in-java-with-examples/. Study MyLinkedList.java carefully to understand how it is structured, and where and what you need to modify/implement for MyTwoWayLinkedList. Since MyTwoWayLinkedList extends java.util.AbstractSequentialList which implements Iterable, it includes an iterator () method that returns an object of the iterator interface automatically. Read the article https://www.softwaretestinghelp.com/java/learn-to-use-java-iterator-with-examples/ for basics to use iterator. In order to iterate through MyTwoWayLinkedList, we need to implement the methods listIterator() and listIterator(int index). Both return an instance of java.util.ListIterator. The former sets the cursor to head of the list and the latter to the element at the specific index. public ListIterator listIterator() { return new TwoWayLinkedListIterator(); } public ListIterator listIterator(int index) { return new TwoWayLinkedListIterator(index); } Here, TwoWayLinkedListIterator is a private class similar to LinkedListIterator in MyLinkedList.java. It defines a custom iterator for TwoWayLinkedList. Make sure to implement methods previous(), previousIndex(), and hasPrevious() similar to next(), nextIndex(), and hasNext() methods in MyLinkedList class. All the methods dealing with add/remove may need to be modified to handle both next and previous fields. Implement a new class named TestMyTwoWayLinkedList to test your two-way linked list with Double as the concert type for the elements in the linked list. Good luck and happy programming! 11/9/21, 9:12 PM https://learn-us-east-1-prod-fleet02-xythos.content.blackboardcdn.com/5dfd4f5d9105a/9299818?X-Blackboard-Expiration=163653… public class MyLinkedList implements MyList { protected Node head, tail; protected int size = 0; // Number of elements in the list /** Create an empty list */ public MyLinkedList() { } /** Create a list from an array of objects */ public MyLinkedList(E[] objects) { for (int i = 0; i < objects.length; i++) add(objects[i]); } /** Return the head element in the list */ public E getFirst() { if (size == 0) { return null; } else { return head.element; } } /** Return the last element in the list */ public E getLast() { if (size == 0) { return null; } else { return tail.element; } } /** Add an element to the beginning of the list */ public void addFirst(E e) { Node newNode = new Node(e); // Create a new node newNode.next = head; // link the new node with the head head = newNode; // head points to the new node size++; // Increase list size } if (tail == null) // the new node is the only node in list tail = head; /** Add an element to the end of the list */ public void addLast(E e) { Node newNode = new Node(e); // Create a new for element e if (tail == null) { head = tail = newNode; // The new node is the only node in list } else { tail.next = newNode; // Link the new with the last node tail = newNode; // tail now points to the last node } } size++; // Increase size @Override /** Add a new element at the specified index * in this list. The index of the head element is 0 */ public void add(int index, E e) { if (index == 0) { https://learn-us-east-1-prod-fleet02-xythos.content.blackboardcdn.com/5dfd4f5d9105a/9299818?X-Blackboard-Expiration=1636534800000&X-Blackb… 1/4 11/9/21, 9:12 PM } https://learn-us-east-1-prod-fleet02-xythos.content.blackboardcdn.com/5dfd4f5d9105a/9299818?X-Blackboard-Expiration=163653… addFirst(e); } else if (index >= size) { addLast(e); } else { Node current = head; for (int i = 1; i < index; i++) { current = current.next; } Node temp = current.next; current.next = new Node(e); (current.next).next = temp; size++; } /** Remove the head node and * return the object that is contained in the removed node. */ public E removeFirst() { if (size == 0) { return null; } else { E temp = head.element; head = head.next; size–; if (head == null) { tail = null; } return temp; } } /** Remove the last node and * return the object that is contained in the removed node. */ public E removeLast() { if (size == 0) { return null; } else if (size == 1) { E temp = head.element; head = tail = null; size = 0; return temp; } else { Node current = head; for (int i = 0; i < size – 2; i++) { current = current.next; } } } E temp = tail.element; tail = current; tail.next = null; size–; return temp; @Override /** Remove the element at the specified position in this * list. Return the element that was removed from the list. */ public E remove(int index) { if (index < 0 || index >= size) { https://learn-us-east-1-prod-fleet02-xythos.content.blackboardcdn.com/5dfd4f5d9105a/9299818?X-Blackboard-Expiration=1636534800000&X-Blackb… 2/4 11/9/21, 9:12 PM https://learn-us-east-1-prod-fleet02-xythos.content.blackboardcdn.com/5dfd4f5d9105a/9299818?X-Blackboard-Expiration=163653… return null; } else if (index == 0) { return removeFirst(); } else if (index == size – 1) { return removeLast(); } else { Node previous = head; for (int i = 1; i < index; i++) { previous = previous.next; } } } Node current = previous.next; previous.next = current.next; size–; return current.element; @Override /** Override toString() to return elements in the list */ public String toString() { StringBuilder result = new StringBuilder(“[“); Node current = head; for (int i = 0; i < size; i++) { result.append(current.element); current = current.next; if (current != null) { result.append(“, “); // Separate two elements with a comma } else { result.append(“]”); // Insert the closing ] in the string } } } return result.toString(); @Override /** Clear the list */ public void clear() { size = 0; head = tail = null; } @Override /** Return true if this list contains the element e */ public boolean contains(Object e) { // Left as an exercise return true; } @Override /** Return the element at the specified index */ public E get(int index) { // Left as an exercise return null; } @Override /** Return the index of the first matching element in * this list. Return -1 if no match. */ public int indexOf(Object e) { // Left as an exercise return 0; } https://learn-us-east-1-prod-fleet02-xythos.content.blackboardcdn.com/5dfd4f5d9105a/9299818?X-Blackboard-Expiration=1636534800000&X-Blackb… 3/4 11/9/21, 9:12 PM https://learn-us-east-1-prod-fleet02-xythos.content.blackboardcdn.com/5dfd4f5d9105a/9299818?X-Blackboard-Expiration=163653… @Override /** Return the index of the last matching element in * this list. Return -1 if no match. */ public int lastIndexOf(E e) { // Left as an exercise return 0; } @Override /** Replace the element at the specified position * in this list with the specified element. */ public E set(int index, E e) { // Left as an exercise return null; } @Override /** Override iterator() defined in Iterable */ public java.util.Iterator iterator() { return new LinkedListIterator(); } private class LinkedListIterator implements java.util.Iterator { private Node current = head; // Current index @Override public boolean hasNext() { return (current != null); } @Override public E next() { E e = current.element; current = current.next; return e; } } @Override public void remove() { // Left as an exercise } protected static class Node { E element; Node next; } } public Node(E element) { this.element = element; } @Override /** Return the number of elements in this list */ public int size() { return size; } https://learn-us-east-1-prod-fle
et02-xythos.content.blackboardcdn.com/5dfd4f5d9105a/9299818?X-Blackboard-Expiration=1636534800000&X-Blackb… 4/4 11/9/21, 9:12 PM https://learn-us-east-1-prod-fleet02-xythos.content.blackboardcdn.com/5dfd4f5d9105a/9299819?X-Blackboard-Expiration=163653… import java.util.Collection; public interface MyList extends java.util.Collection { /** Add a new element at the specified index in this list */ public void add(int index, E e); /** Return the element from this list at the specified index */ public E get(int index); /** Return the index of the first matching element in this list. * Return -1 if no match. */ public int indexOf(Object e); /** Return the index of the last matching element in this list * Return -1 if no match. */ public int lastIndexOf(E e); /** Remove the element at the specified position in this list * Shift any subsequent elements to the left. * Return the element that was removed from the list. */ public E remove(int index); /** Replace the element at the specified position in this list * with the specified element and returns the new set. */ public E set(int index, E e); @Override /** Add a new element at the end of this list */ public default boolean add(E e) { add(size(), e); return true; } @Override /** Return true if this list contains no elements */ public default boolean isEmpty() { return size() == 0; } @Override /** Remove the first occurrence of the element e * from this list. Shift any subsequent elements to the left. * Return true if the element is removed. */ public default boolean remove(Object e) { if (indexOf(e) >= 0) { remove(indexOf(e)); return true; } else return false; } @Override public default boolean containsAll(Collection c) { // Left as an exercise return true; } @Override public default boolean addAll(Collection c) { // Left as an exercise https://learn-us-east-1-prod-fleet02-xythos.content.blackboardcdn.com/5dfd4f5d9105a/9299819?X-Blackboard-Expiration=1636534800000&X-Blackb… 1/2 11/9/21, 9:12 PM } https://learn-us-east-1-prod-fleet02-xythos.content.blackboardcdn.com/5dfd4f5d9105a/9299819?X-Blackboard-Expiration=163653… return true; @Override public default boolean retainAll(Collection c) { // Left as an exercise return true; } @Override public default Object[] toArray() { // Left as an exercise return null; } } @Override public default T[] toArray(T[] array) { // Left as an exercise return null; } https://learn-us-east-1-prod-fleet02-xythos.content.blackboardcdn.com/5dfd4f5d9105a/9299819?X-Blackboard-Expiration=1636534800000&X-Blackb… 2/2