Here is the code we wrote today. First the test case for remove(T).
@Test
public void testRemove() {
assertEquals(false, list.remove("?"));
//check that we only remove first occurrence
list.add("Apple");
list.add("Banana");
list.add("Cherry");
list.add("Durian");
list.add("Estonia");
list.add("Cherry");
assertEquals(true, list.remove("Cherry"));
assertEquals(5, list.size());
assertEquals("Durian", list.get(2));
assertEquals("Estonia", list.get(3));
assertEquals("Cherry", list.get(4));
assertEquals(false, list.remove("random item"));
//remove first thing
assertEquals(true, list.remove("Apple"));
assertEquals(4, list.size());
assertEquals("Durian", list.get(1));
assertEquals("Estonia", list.get(2));
assertEquals("Cherry", list.get(3));
//remove last thing
assertEquals(true, list.remove("Cherry"));
assertEquals(3, list.size());
assertEquals("Durian", list.get(1));
assertEquals("Estonia", list.get(2));
}
}
Then here are our two implementations:
/*
//version with curr and prev marching down list together:
public boolean remove(T item) {
//remove item from list if it's there; return whether it was
Node curr = head; //current node
Node prev = null; //node before current one
while(curr != null) {
if(curr.value.equals(item)) {
if(prev == null) //special case: removing first value
head = curr.next;
else
prev.next = curr.next;
return true;
}
prev = curr; //advance the references
curr = curr.next;
}
return false;
}
*/
//version with just one reference traversing the list
public boolean remove(T item) {
//remove item from list if it's there; return whether it was
Node curr = head;
if(curr == null) //special case: empty list
return false;
if(curr.value.equals(item)) { //special case: removing first value
head = curr.next;
return true;
}
while(curr.next != null) {
if(curr.next.value.equals(item)) {
curr.next = curr.next.next;
return true;
}
curr = curr.next;
}
return false;
}