Public Class Singlylinkedlist Implements Cloneable Iterable Nested Node Class Node Singly Q43827050
public class SinglyLinkedList implements Cloneable, Iterable{
//—————- nested Node class —————-
/**
* Node of a singly linked list, which stores a reference toits
* element and to the subsequent node in the list (or null ifthis
* is the last node).
*/
private static class Node {
/** The element stored at this node */
private E element; // reference to the element stored at thisnode
/** A reference to the subsequent node in the list */
private Node next; // reference to the subsequent node in thelist
/**
* Creates a node with the given element and next node.
*
* @param e the element to be stored
* @param n reference to a node that should follow the newnode
*/
public Node(E e, Node n) {
element = e;
next = n;
}
// Accessor methods
/**
* Returns the element stored at the node.
* @return the element stored at the node
*/
public E getElement() { return element; }
/**
* Returns the node that follows this one (or null if no suchnode).
* @return the following node
*/
public Node getNext() { return next; }
// Modifier methods
/**
* Sets the node’s next reference to point to Node n.
* @param n the node that should follow this one
*/
public void setNext(Node n) { next = n; }
} //———– end of nested Node class ———–
// instance variables of the SinglyLinkedList
/** The head node of the list */
private Node head = null; // head node of the list (or null ifempty)
/** The last node of the list */
private Node tail = null; // last node of the list (or null ifempty)
/** Number of nodes in the list */
private int size = 0; // number of nodes in the list
/** Constructs an initially empty list. */
public SinglyLinkedList() { } // constructs an initially emptylist
// access methods
/**
* Returns the number of elements in the linked list.
* @return number of elements in the linked list
*/
public int size() { return size; }
/**
* Tests whether the linked list is empty.
* @return true if the linked list is empty, false otherwise
*/
public boolean isEmpty() { return size == 0; }
/**
* Returns (but does not remove) the first element of the list
* @return element at the front of the list (or null if empty)
*/
public E first() { // returns (but does not remove) the firstelement
if (isEmpty()) return null;
return head.getElement();
}
/**
* Returns (but does not remove) the last element of the list.
* @return element at the end of the list (or null if empty)
*/
public E last() { // returns (but does not remove) the lastelement
if (isEmpty()) return null;
return tail.getElement();
}
/**
* Returns (but does not remove) the penultimate node of thelist.
* @return node before the end of the list – exception if size <2 (IllegalStateException)
*/
private Node penultimateNode( ) {
//***** Complete this method ***** //
return null;
}
/**
* Returns (but does not remove) the penultimate element of thelist.
* @return element before the end of the list – exception if size< 2 (IllegalStateException)
*/
public E penultimate() {
return penultimateNode().getElement();
}
/**
* Returns (but does not remove) the middle element of thelist.
* @return element before the end of the list – exception if size =0 (IllegalStateException)
*/
public E getMiddle() {
//***** Complete this method*****//
return null;
}
// update methods
/**
* Adds an element to the front of the list.
* @param e the new element to add
*/
public void addFirst(E e) { // adds element e to the front of thelist
head = new Node<>(e, head); // create and link a newnode
if (size == 0)
tail = head; // special case: new node becomes tail also
size++;
}
/**
* Adds an element to the end of the list.
* @param e the new element to add
*/
public void addLast(E e) { // adds element e to the end of thelist
Node newest = new Node<>(e, null); // node will eventually bethe tail
if (isEmpty())
head = newest; // special case: previously empty list
else
tail.setNext(newest); // new node after existing tail
tail = newest; // new node becomes the tail
size++;
}
/**
* Adds an element to be the second of the list.
* @param e the new element to add
*/
public void addSecond(E e) {
//***** Complete this method *****//
}
/**
* Adds an element at the ith position in the list.
* @param e the new element to add.
*/
public void add(E e, int i) {
//***** Complete this method *****//
}
/**
* Removes and returns the first element of the list.
* @return the removed element (or null if empty)
*/
public E removeFirst() { // removes and returns the firstelement
if (isEmpty()) return null; // nothing to remove
E answer = head.getElement();
head = head.getNext(); // will become null if list had only onenode
size–;
if (size == 0)
tail = null; // special case as list is now empty
return answer;
}
/**
* Removes and returns the ith element of the list.
* @return the removed element exception i not in proper range
*/
public E remove(int i) {
//***** Complete this method *****//
return null;
}
/**
* Reverses the order of the nodes in the list.
*
*/
public void reverse() {
//***** Complete this method *****//
}
@SuppressWarnings({“unchecked”})
public boolean equals(Object o) {
if (o == null) return false;
if (getClass() != o.getClass()) return false;
SinglyLinkedList other = (SinglyLinkedList) o; // usenonparameterized type
if (size != other.size) return false;
Node walkA = head; // traverse the primary list
Node walkB = other.head; // traverse the secondary list
while (walkA != null) {
if (!walkA.getElement().equals(walkB.getElement())) return false;//mismatch
walkA = walkA.getNext();
walkB = walkB.getNext();
}
return true; // if we reach this, everything matchedsuccessfully
}
@SuppressWarnings({“unchecked”})
public SinglyLinkedList clone() throws CloneNotSupportedException{
// always use inherited Object.clone() to create the initialcopy
SinglyLinkedList other = (SinglyLinkedList) super.clone(); // safecast
if (size > 0) { // we need independent chain of nodes
other.head = new Node<>(head.getElement(), null);
Node walk = head.getNext(); // walk through remainder of originallist
Node otherTail = other.head; // remember most recently creatednode
while (walk != null) { // make a new node storing sameelement
Node newest = new Node<>(walk.getElement(), null);
otherTail.setNext(newest); // link previous node to this one
otherTail = newest;
walk = walk.getNext();
}
}
return other;
}
public int hashCode() {
int h = 0;
for (Node walk=head; walk != null; walk = walk.getNext()) {
h ^= walk.getElement().hashCode(); // bitwise exclusive-or withelement’s code
h = (h << 5) | (h >>> 27); // 5-bit cyclic shift ofcomposite code
}
return h;
}
/**
* Produces a string representation of the contents of thelist.
* This exists for debugging purposes only.
*/
public String toString() {
StringBuilder sb = new StringBuilder(“(“);
Node walk = head;
while (walk != null) {
sb.append(walk.getElement());
if (walk != tail)
sb.append(“, “);
walk = walk.getNext();
}
sb.append(“)”);
return sb.toString();
}
/**
* Implements java.lang.Iterable
*/
public java.util.Iterator iterator() {
return new ForwardIterator();
}
private class ForwardIterator implementsjava.util.Iterator {
//***** Define appropriate instancevariables here *****//
public boolean hasNext() {
//***** Completethis method *****//
returnfalse;
}
// Note: this method hasundefined behavior if hasNext() return false
public E next() {
//***** Completethis method *****//
returnnull;
}
}
}
Your Tasks Complete the following tasks. When you are finished you should be able to run the provided tester and get correct output for all tasks. a. Complete the penultimateNode () method. (See exercise R-3.6). b. Complete a reverse () method for the SinglyLinkedList class. Empty method has been provided for you. Add a addSecond (E e) method – If list is empty, throw exception. Parameter e will be the second element in the list after this operation has completed. This method should return void. d. Complete an add (E e, int i) method to the SinglyLinkedList class. What is the run time of this method? Throw an exception if į is exception in the scoreboard example in class). (į must be >= 0 and <= size). After this operation, the parameter e will be stored in a node at the given index į. Method returns void. e. Add a remove (int i) method to the SinglyLinkedList class – What is the run time of this method? Throw an exception if i is an invalid index. This method should also return the C. invalid index (we covered an app iate Element that was removed. f. Complete a getMiddle() method. Throw an exception (InvalidState) if the list is empty. If there is only one element, return that element. If there is an even number of elements return the “left” element. g. Complete a ForwardIterator class. Look at the java.util.Iterator javadocs for information about how this function should operate. You only need to support hasNext () and next () methods. Show transcribed image text Your Tasks Complete the following tasks. When you are finished you should be able to run the provided tester and get correct output for all tasks. a. Complete the penultimateNode () method. (See exercise R-3.6). b. Complete a reverse () method for the SinglyLinkedList class. Empty method has been provided for you. Add a addSecond (E e) method – If list is empty, throw exception. Parameter e will be the second element in the list after this operation has completed. This method should return void. d. Complete an add (E e, int i) method to the SinglyLinkedList class. What is the run time of this method? Throw an exception if į is exception in the scoreboard example in class). (į must be >= 0 and
Expert Answer
Answer to public class SinglyLinkedList implements Cloneable, Iterable { //—————- nested Node class —————- /**…
OR