Question: In the main method, I cannot iterate backwards through the list. I think it's because I don't have the setToEnd() method in my Iterator class

In the main method, I cannot iterate backwards through the list. I think it's because I don't have the setToEnd() method in my Iterator class written correctly. What needs to be changed so that the list is iterated backwards? Here is my code:

------------------------------------------------------------------------------------------

public class ListRunner {

public static void main(String[] args) {

Dog fifi = new Dog("Fifi", 12, 8); Dog butch = new Dog("Butch", 10, 10); Dog leonard = new Dog("Leonard", 22, 13); Dog spot = new Dog("Spot", 17, 9);

LinkedList myDogList = new LinkedList(); System.out.println();

myDogList.add(fifi); System.out.println(myDogList); System.out.println();

myDogList.add(butch); myDogList.add(leonard); myDogList.add(spot);

System.out.println(myDogList); System.out.println();

Dog jack = new Dog("Jack", 18, 18);

myDogList.add(jack,1);

System.out.println(myDogList); System.out.println();

// the following lines build Iterators, and provide an example // of how you would use an Iterator to step through this data // structure Iterator iter1 = myDogList.getIterator(); Iterator iter2 = myDogList.getIterator();

System.out.println("Iterating using Iterators!!!"); while (iter1.hasNext()) { Dog foo = iter1.next(); System.out.println(foo); }

System.out.println(); // In a doubly-linked list, an iterator can move either forward or backward, // so this should print the list out in reverse order if you've correctly // implemented everything System.out.println("Iterating backwards using Iterators!!!"); iter2.setToEnd(); while (iter2.hasPrior()) { Dog foo = iter2.prior(); System.out.println(foo); }

}// end main

} // end class ListRunner

------------------------------------------------------------------------------------------

public class LinkedList { Node itsFirstNode; Node itsLastNode; private int size;

public LinkedList() { itsFirstNode = null; itsLastNode = null; size = 0; }

public Iterator getIterator() { return new Iterator(this); }

// THIS WILL NEED TO BE MODIFIED FOR DOUBLY-LINKED LIST public void add(T element) {

Node node = new Node(element);

if (itsFirstNode == null) { itsFirstNode = node; itsLastNode = node; } else { itsLastNode.setNextNode(node); node.setPriorNode(itsLastNode);//prior node set from new node to last node itsLastNode = node; } size++; }

// THIS WILL NEED TO BE MODIFIED FOR DOUBLY-LINKED LIST public void add(T element, int index) {

int counter = 0; Node newNode = new Node(element); Node current = itsFirstNode;

while (current.getNextNode() != null ) {

if (counter == index - 1 ) break;

current = current.getNextNode(); counter++; } newNode.setNextNode(current.getNextNode()); Node temp=current.getNextNode();//temp node is next node of current node temp.setPriorNode(newNode); current.setNextNode(newNode); newNode.setPriorNode(current); size++; }

public T get(int index) {

int counter = 0; Node current = itsFirstNode;

while (current.getNextNode() != null ) {

if (counter == index) break;

current = current.getNextNode(); counter++; } return current.getData(); }

// returns true if element is in the list, false if not public boolean contains(T element) {

Node head = itsFirstNode; boolean res = false;

if (itsFirstNode == null) return res;

else {

while (head != null) {

if(head.getData() == element){ res = true; break; } head.setNextNode(head.getNextNode()); } } return res; }

// returns the index of the element if it is in the list, -1 if not found public int indexOf(T element) {

Node head = itsFirstNode; int index = 0;

if(itsFirstNode == null) return -1;

else {

while (head != null) {

if (head.getData() == element) { break; } head.setNextNode(head.getNextNode()); index++; } } return index; }

// returns an Iterator at the location of the element if it is in the list // returns the null reference if the element is not found /* we cannot get java iterator to an user defined object unless implementing iterable interface*/ /* therefore i changed return type to Node and return reference to current node*/ public Node iteratorAt(T element) {

Node head = itsFirstNode;

if (itsFirstNode == null) return null;

else {

while (head != null) {

if (head.getData() == element) { break; } head.setNextNode(head.getNextNode()); } } return head; }

public String toString() {

String returnVal = ""; Node current = itsFirstNode;

if (size != 0 ) {

while (current.getNextNode() != null ) { returnVal += current.toString(); returnVal += " "; current = current.getNextNode(); } returnVal += current.toString(); } return returnVal; } // end toString

class Node { private T data; private Node itsNext; private Node itsPrior;

public Node(T data) { itsNext = null; itsPrior = null; this.data = data; }

public T getData() { return this.data; }

public Node getNextNode() { return itsNext; }

public Node getPriorNode() { return itsPrior; }

public void setNextNode(Node next) { itsNext = next; }

public void setPriorNode(Node prior) { itsPrior=prior; }

public String toString() { return data.toString(); }

} // end of Node

} // end LinkedList class

------------------------------------------------------------------------------------------

public class Iterator {

private LinkedList myList; private LinkedList.Node myCurrentNode;

public Iterator(LinkedList list) { myList = list; myCurrentNode = myList.itsFirstNode; }

// return true if there is a "next" element, otherwise returns false public boolean hasNext() { if (myCurrentNode != null) return true; return false; }

// return true if there is a "prior" element, otherwise returns false public boolean hasPrior() { if (myCurrentNode.getNextNode() != null) return true; return false; }

// returns the "next" node (really the current one) and // moves the Iterator forward by one node public T next() { T data = myCurrentNode.getData(); myCurrentNode = myCurrentNode.getNextNode(); return data; }

// returns the "prior" node (really the current one) and // moves the Iterator backward by one node public T prior() { T data = myCurrentNode.getData(); myCurrentNode = myCurrentNode.getPriorNode(); return data; }

// Sets this iterator to point to the last Node in the list public void setToEnd() { while (myCurrentNode.getNextNode() != null) myCurrentNode = myCurrentNode.getNextNode(); }

} //end Iterator class

------------------------------------------------------------------------------------------

public class Dog {

private int weight; private int heightAtShoulder; private String name;

public Dog (String name, int w, int h) { System.out.println("Just Entered Dog constructor"); this.name = name; this.weight = w; this.heightAtShoulder = h; System.out.println("Leaving Dog constructor"); }

public String getName() {return this.name;} public int getHeight() {return this.heightAtShoulder;} public int getWeight() {return this.weight;}

public void bark() {System.out.println("woof");}

public String toString() { return "Dog: " + name + " , height: " + heightAtShoulder + " weight: " + weight; }

@Override public boolean equals(Object o) {

if (o instanceof Dog) { //now we can do checks Dog tempDogRef = (Dog)(o); if (tempDogRef.getName().equals(this.name) && tempDogRef.getHeight() == this.heightAtShoulder && tempDogRef.getWeight() == this.weight) return true; } return false; }

} // end class Dog

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!