Implement check, create and iterate
This commit is contained in:
@ -3,4 +3,10 @@ package aud.exam.prep.list;
|
|||||||
import aud.exam.prep.SequenceProcessor;
|
import aud.exam.prep.SequenceProcessor;
|
||||||
|
|
||||||
abstract class DoubleListItemProcessor<T> implements SequenceProcessor<T, DoubleListItem<T>> {
|
abstract class DoubleListItemProcessor<T> implements SequenceProcessor<T, DoubleListItem<T>> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<T> iterate(DoubleListItem<T> list) {
|
||||||
|
return () ->
|
||||||
|
new ListItemIterator<>(list);
|
||||||
|
}
|
||||||
}
|
}
|
@ -3,6 +3,8 @@ package aud.exam.prep.list;
|
|||||||
import aud.exam.prep.Pair;
|
import aud.exam.prep.Pair;
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
public class RecursiveDoubleListItemProcessor<T> extends DoubleListItemProcessor<T> {
|
public class RecursiveDoubleListItemProcessor<T> extends DoubleListItemProcessor<T> {
|
||||||
|
|
||||||
@ -176,19 +178,58 @@ public class RecursiveDoubleListItemProcessor<T> extends DoubleListItemProcessor
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean check(DoubleListItem<T> list) {
|
public boolean check(DoubleListItem<T> list) {
|
||||||
// TODO: Your training
|
return checkRec(list, new HashSet<>(), null);
|
||||||
throw new RuntimeException("unimplemented");
|
}
|
||||||
|
|
||||||
|
private boolean checkRec(DoubleListItem<T> list, HashSet<DoubleListItem<T>> seen, DoubleListItem<T> prev) {
|
||||||
|
if (list == null) {
|
||||||
|
if (seen.isEmpty()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prev == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return prev.next == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list.prev != prev) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prev != null && prev.next != list) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list.key == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (seen.contains(list)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
seen.add(list);
|
||||||
|
return checkRec(list.next, seen, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DoubleListItem<T> create(Iterable<T> iterable) {
|
public DoubleListItem<T> create(Iterable<T> iterable) {
|
||||||
// TODO: Your training
|
var iter = iterable.iterator();
|
||||||
throw new RuntimeException("unimplemented");
|
return createRec(iter, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private DoubleListItem<T> createRec(Iterator<T> iter, DoubleListItem<T> prev) {
|
||||||
public Iterable<T> iterate(DoubleListItem<T> list) {
|
if (!iter.hasNext()) {
|
||||||
// TODO: Your training
|
return null;
|
||||||
throw new RuntimeException("unimplemented");
|
}
|
||||||
|
|
||||||
|
var item = new DoubleListItem<T>();
|
||||||
|
item.key = iter.next();
|
||||||
|
item.next = createRec(iter, item);
|
||||||
|
item.prev = prev;
|
||||||
|
|
||||||
|
return item;
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user