\documentclass{bschlangaul-aufgabe}
\bLadePakete{java,grafik}

\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe 2},
  Thematik = {DoubleLinkedList},
  Referenz = 66115-2021-F.T2-TA2-A2,
  RelativerPfad = Examen/66115/2021/03/Thema-2/Teilaufgabe-2/Aufgabe-2.tex,
  ZitatSchluessel = examen:66115:2021:03,
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Doppelt-verkettete Liste},
  EinzelpruefungsNr = 66115,
  Jahr = 2021,
  Monat = 03,
  ThemaNr = 2,
  TeilaufgabeNr = 2,
  AufgabeNr = 2,
}

\let\j=\bJavaCode

\usetikzlibrary{calc,shapes.multipart,chains,arrows,positioning}

{Gegeben sei die folgende Java-Implementierung einer doppelt-verketteten
Liste.}
\index{Doppelt-verkettete Liste}
\footcite{examen:66115:2021:03}

\begin{bJavaAngabe}
class DoubleLinkedList {
  private Item head;

  public DoubleLinkedList() {
    head = null;
  }

  public Item append(Object val) {
    if (head == null) {
      head = new Item(val, null, null);
      head.prev = head;
      head.next = head;
    } else {
      Item item = new Item(val, head.prev, head);
      head.prev.next = item;
      head.prev = item;
    }
    return head.prev;
  }

  public Item search(Object val) {
    // ...
  }

  public void delete(Object val) {
    // ...
  }

  class Item {
    private Object val;
    private Item prev;
    private Item next;

    public Item(Object val, Item prev, Item next) {
      this.val = val;
      this.prev = prev;
      this.next = next;
    }
  }
}
\end{bJavaAngabe}

\begin{enumerate}

%%
% a)
%%

\item Skizzieren Sie den Zustand der Datenstruktur nach Aufruf der
folgenden Befehlssequenz. Um Variablen mit Zeigern auf Objekte
darzustellen, können Sie mit dem Variablennamen beschriftete Pfeile
verwenden.

\begin{bJavaAngabe}
DoubleLinkedList list = new DoubleLinkedList();
list.append("a");
list.append("b");
list.append("c");
\end{bJavaAngabe}

\begin{bAntwort}
\begin{tikzpicture}[
  list/.style={
    rectangle split,
    rectangle split parts=3,
    draw,
    rectangle split horizontal,
    minimum size=18pt,
    inner sep=5pt,
    text=black,
  },
  ->,
  start chain
]

  \node[list,on chain] (A) {\nodepart{second} a};
  \node[list,on chain] (B) {\nodepart{second} b};
  \node[list,on chain] (C) {\nodepart{second} c};

  \node (head) [left= of A] {head};

  \path[*->] let \p1 = (A.three), \p2 = (A.center) in (\x1,\y2) edge [bend left] ($(B.one)+(0,0.2)$);
  \path[*->] let \p1 = (B.three), \p2 = (B.center) in (\x1,\y2) edge [bend left] ($(C.one)+(0,0.2)$);

  \draw[*->] (head) -- ($(A.one)+(0.2,0.1)$);
  \path[*->] ($(B.one)+(0.1,0.1)$) edge [bend left] ($(A.three)+(0,-0.05)$);
  \path[*->] ($(C.one)+(0.1,0.1)$) edge [bend left] ($(B.three)+(0,-0.05)$);

  \path[*->] ($(C.three)+(0.1,0.1)$) edge [bend left] ($(A.one)+(0,-0.05)$);
  \path[*->] ($(A.one)+(0.1,0.2)$) edge [bend left] ($(C.three)+(0,0.2)$);

\end{tikzpicture}
\end{bAntwort}

%%
%
%%

\item Implementieren Sie in der Klasse \j{DoubleLinkedList} die Methode
\j{search}, die zu einem gegebenen Wert das Item der Liste mit dem
entsprechenden Wert, oder \j{null} falls der Wert nicht in der Liste
enthalten ist, zurückgibt.

\begin{bAntwort}
\bJavaExamen[firstline=23,lastline=35]{66115}{2021}{03}{DoubleLinkedList}
\end{bAntwort}

%%
%
%%

\item Implementieren Sie in der Klasse \j{DoubleLinkedList} die Methode
\j{delete}, die das erste Vorkommen eines Wertes aus der Liste entfernt.
Ist der Wert nicht in der Liste enthalten, terminiert die Methode
„stillschweigend“, \dh ohne Änderung der Liste und ohne Fehlermeldung.
Sie dürfen die Methode \j{search} aus Teilaufgabe b) verwenden, auch
wenn Sie sie nicht implementiert haben.

\begin{bAntwort}
\bJavaExamen[firstline=37,lastline=50]{66115}{2021}{03}{DoubleLinkedList}
\end{bAntwort}

%%
%
%%

\item Beschreiben Sie die notwendigen Änderungen an der Datenstruktur
und an den bisherigen Implementierungen, um eine Methode \j{size}, die
die Anzahl der enthaltenen Items zurück gibt, mit Laufzeit
$\mathcal{O}(1)$ zu realisieren.

\begin{bAntwort}
In der Klasse wird ein Zähler eingefügt, der bei jedem Aufruf der
Methode \j{append} um eins nach oben gezählt wird und bei jedem
erfolgreichen Löschen in der \j{delete}-Methode um eins nach unten
gezählt wird. Mit \j{return} kann der Zählerstand in $\mathcal{O}(1)$
ausgegeben werden. Dazu müsste ein Getter zum Ausgeben implementiert
werden. Die Datenstruktur bleibt unverändert.
\end{bAntwort}

\end{enumerate}
\end{document}
