package tapp;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import org.junit.Test;
/**
* <ol>
* <li>MyLinkedList is a facet of {@link List} provide only an one way iterator for
* standard {@link List} interface to represent LinkedList concept.
* <li>This algorithm use two {@link Iterator}s to traverse the LinkedList in only one loop.
* </ol>
*
*/
public class MorganStanelyTest {
// Provide only iterator interface to avoid using convenient methods like
// size(), get(N)
static class MyLinkedList<T> {
final LinkedList<T> provider = new LinkedList<T>();
public MyLinkedList(List<T> provider) {
this.provider.addAll(provider);
}
public Iterator<T> iterator() {
return provider.iterator();
}
public T getRealMidElementForComparing() {
if (provider.isEmpty()) {
return null;
}
return provider.get((provider.size() + 1) / 2 - 1);
}
}
private static final int MAX_ELEMENT = 10;
private MyLinkedList<Integer> setupLinkedList() {
final List<Integer> provider = new ArrayList<Integer>();
final Random random = new Random();
int targetSize = random.nextInt(MAX_ELEMENT);
while (--targetSize >= 0) {
provider.add(random.nextInt());
}
return new MyLinkedList<Integer>(provider);
}
@Test
public void testLinkedList() {
MyLinkedList<Integer> list = setupLinkedList();
Iterator<Integer> iteratorCounter = list.iterator();
Iterator<Integer> iteratorMiddle = list.iterator();
Integer mid = null;
int counter = 0;
while (iteratorCounter.hasNext()) {
++counter;
if (counter % 2 == 1) {
mid = iteratorMiddle.next();
}
iteratorCounter.next();
}
assertEquals(list.getRealMidElementForComparing(), mid);
System.out.println("mid == " + mid);
}
}