Note that there are some explanatory texts on larger screens.

plurals
  1. POStuck in a loop
    primarykey
    data
    text
    <p>I'm trying to implement my own List system in Java.</p> <p>the <code>List</code> class file :</p> <pre><code>package RoutingDemo.List; /** * A 2-way Linked-List to store generic elements. * */ public class List { /* Instance Variables --------------------------------------------------------------------------- */ /** * Reference to element. */ private Object info; /** * Reference to previous NodeList instance. */ private List prev; /** * Reference to next NodeList instance. */ private List next; /* Constructors --------------------------------------------------------------------------- */ /** * Creates a new empty list. */ public List() { prev = null; next = null; info = null; } /* Methods --------------------------------------------------------------------------- */ /** * Adds an element to the list. * * @param o Element to be added */ public List add(Object o) { if(info == null) { info = o; prev = null; next = null; return this; } else { List temp = new List(); temp.add(o); return addList(temp); } } /** * Appends an existing list to this list. * * @param newList List to be appended */ public List addList(List newList) { if(newList.info() == null) return this; List ref = this; ref.last().setNext(newList.first()); newList.first().setPrev(ref.last()); return ref; } /** * Get number of elements in the list. * * @return number of elements in list */ public int count() { if(info == null) return 0; List ref = this.first(); int count = 0; while(true) { count++; if(!ref.isLast()) ref = ref.next(); else break; } return count; } /** * Deletes an element from the list. * * @param o Element to be deleted * @return List which does NOT * contain element o */ public List delete(Object o) { if(info == null) return this; List ref = this.first(); while(true) { if(ref.info() == o) { if(ref.isFirst() &amp;&amp; ref.isLast()) { ref = new List(); break; } else if(ref.isFirst()) { ref = ref.next(); ref.killPrev(); break; } else if(ref.isLast()) { /* *** THIS IS THE CASE THAT WILL BE CALLED FOR THIS TEST **** */ ref = ref.prev(); ref.killNext(); break; } else { ref.prev().setNext(ref.next()); ref.next().setPrev(ref.prev()); ref = ref.prev(); break; } } else { if(!ref.isLast()) ref = ref.next(); else break; } } return ref; } /** * Moves to first element in List. * * * @return List pointing to first * element in list */ public List first() { List ref = this; while(!ref.isFirst()) { /* *** STUCK HERE *** */ ref = ref.prev(); } return ref; } /** * Returns current list element. * * @return current list element */ public Object info() { return info; } /** * Checks whether list is empty. * * @return true, if list is empty * , false otherwise. */ public boolean isEmpty() { if(count() &gt; 0) return false; else return true; } /** * Checks whether current element is the first element. * * @return true, if current element is * first element, false otherwise. */ public boolean isFirst() { if(prev == null) return true; else return false; } /** * checks whether current element is the last element. * * @return true, if current element is * last element, false otherwise */ public boolean isLast() { if(next == null) return true; else return false; } /** * Cuts the list from next element. * * * @param l new link for current element */ public void killNext() { next = null; } /** * Cuts the list from previous element. * * * @param l new link */ public void killPrev() { prev = null; } /** * Moves to last element in List. * * * @return List pointing to last * element in list */ public List last() { List ref = this; while(!ref.isLast()) { ref = ref.next(); } return ref; } /** * Moves to next element in List * * * @return List pointing to next * element in list */ public List next() { if(!isLast()) return next; else return this; } /** * Moves to previous element in List * * * @return List pointing to previous * element in list */ public List prev() { if(!isFirst()) return prev; else return this; } /** * Sets the next link * * * @param l new link for current element */ public void setNext(List l) { next = l; } /** * Sets the prev link for current element * * * @param l new link */ public void setPrev(List l) { prev = l; } } </code></pre> <p>And I was testing it out like this:</p> <pre><code> class Example { Example() { List nl = new List(); nl = nl.add(new Node(5,6)); System.out.println("" + nl.count()); Node x = new Node(1,3); nl = nl.add(x); System.out.println("" + nl.count()); nl = nl.delete(x); System.out.println("as" + nl.count()); } } public class ListTest { public static void main(String args[]) { new Example(); } } </code></pre> <p>Now, everything is fine when I add the first two nodes. However, I go into an infinite loop when I call the <code>count()</code> <strong>after</strong> I delete a node.</p> <p>And after going through a lot of breakpoints, I've marked the place in the code where I get stuck. Apparently something is wrong in the <code>delete()</code> function, I cannot figure out what I'm doing wrong. </p> <p>For the time being, I've replaced my <code>delete()</code> code with this :</p> <pre><code> public List delete(Object o) { if(info == null) return this; List ref = this.first(); List temp = new List(); while(true) { if(ref.info() != o) temp.add(ref.info()); if(!ref.isLast()) ref = ref.next(); else break; } return temp; } </code></pre> <p>But this wouldnt be memory-friendly for huge lists. Let me know if you can spot the problem!</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload