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;
    }