Alright, so I'm going to throw syntax and a fair bit of list iteration concepts at you.  Brace yourself and have your Java 7 API handy.
A solution to this problem is as follows, in plain steps:
- Iterate through the list.
- Check adjacent elements in the list.
- If they match, remove it.
- Otherwise, let it alone.
 
- Return the resultant non-duplicated list.
Assumption made:
- A list that has a duplicate element that isn't adjacent to other duplicate elements is presumed to exhibit non-Set behavior - that is, if I had input [A, B, B, A] I would expect [A, B A] as output.  This is why I do not recommend using a Setfor this.
There is a word of caution on just using remove() - if this list is accessed concurrently, then you will run into ConcurrentModificationException!  A preferred and slightly cleaner approach would be to use the Iterator or ListIterator interfaces instead.
We have four cases to encounter before we iterate:
- Empty (no elements) - should be disallowed, since we're [virtually] guaranteed that we won't have an empty list
- Singleton (only one element, no duplicates)
- Binary (two elements, one might be a duplicate)
- Poly (n > 2 elements)
There is an edge case we have to account for - more than three repeated elements.  What this means is, while we're iterating, we have to look at both the previous and the next element to determine if we should remove it.
Take, for instance, this example input:
[A, A, A, B, C, D]
If we iterate in the naive method (looking at i+1 while advancing), then we'll skip an element entirely.  The above resultant without looking both left and right would be:
[A, A, B, C, D]
To get around this, we use ListIterator, which supports previous operations.
One run through this with the naive previous approach would yield worse results than before - because we've reset our current cursor's position, and we've already examined it, the next node we'll advance to will be considered a duplicate in error!  (Ironically, you wouldn't get rid of the first couple of duplicates.)
To resolve that, we reset the cursor to the original spot we were at before we looked left.
Here's the solution.  It works on any size list, with respect to our defined constraints and expected behavior above.
public List<String> removeDuplicates(final ArrayList<String> dupeList) {
    if(dupeList.size() == 0) {
        throw new IllegalArgumentException("Zero-length list == evil");
    }
    ListIterator<String> li = dupeList.listIterator();
    String w1;
    String w2;
    if(dupeList.size() == 1) {
        return dupeList;
    } else if(dupeList.size() == 2) {
        w1 = li.next();
        w2 = li.next();
        if(w1.equals(w2)) {
            li.remove();
        }
    } else {
        while(li.hasNext()) {
            if(li.hasPrevious()) {
                w1 = li.previous();
                li.next(); // explained a bit above
            } else {
                w1 = li.next();
            }
            if(li.hasNext()) {
                w2 = li.next();
                if(w1.equals(w2)) {
                    li.remove();
                }
            }
        }
    }
    return dupeList;
}