package hjelpeklasser;
import java.util.*;
public class LenketKø<T> implements Kø<T>
{
private static final class Node<T>
{
private T verdi;
private Node<T> neste;
private Node(Node<T> neste)
{
this.verdi = null;
this.neste = neste;
}
}
private Node<T> fra;
private Node<T> til;
private int antall;
private static final int START_STØRRELSE = 8;
public LenketKø(int størrelse)
{
til = fra = new Node<>(null);
Node<T> p = fra;
for (int i = 1; i < størrelse; i++)
{
p = new Node<>(p);
}
fra.neste = p;
antall = 0;
}
public LenketKø()
{
this(START_STØRRELSE);
}
@Override
public boolean leggInn(T verdi)
{
til.verdi = verdi;
if (til.neste == fra)
{
til.neste = new Node<>(fra);
}
til = til.neste;
antall++;
return true;
}
@Override
public T kikk()
{
if (tom()) throw new NoSuchElementException("Køen er tom!");
return fra.verdi;
}
@Override
public T taUt()
{
if (tom()) throw new NoSuchElementException("Køen er tom!");
T tempverdi = fra.verdi;
fra.verdi = null;
fra = fra.neste;
antall--;
return tempverdi;
}
@Override
public int antall()
{
return antall;
}
@Override
public boolean tom()
{
return fra == til;
}
@Override
public void nullstill()
{
Node<T> p = fra;
for (int i = 1; i < START_STØRRELSE; i++)
{
p.verdi = null;
if (p.neste == fra) break;
p = p.neste;
}
Node<T> q = p.neste;
while (q != fra)
{
q.verdi = null;
q = q.neste;
}
p.verdi = null;
til = p.neste = fra;
antall = 0;
}
@Override
public String toString()
{
StringJoiner s = new StringJoiner(", ", "[", "]");
Node<T> p = fra;
for (int i = 0; i < antall; i++, p = p.neste)
{
s.add(p.verdi == null ? "null" : p.verdi.toString());
}
return s.toString();
}
}