Kapitel 3: Datentyp Liste

Ähnliche Dokumente
Kapitel 3: Datentyp Keller und Schlange

Kapitel 4: Datentyp Keller und Schlange

Kapitel 5: Iterierbare Container

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Programmiertechnik II Klausur SS 2018 Angewandte Informatik Bachelor

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte Informatik Bachelor

Einführung in die Objektorientierte Programmierung Vorlesung 18: Lineare Datenstrukturen. Sebastian Küpper

Programmiertechnik II Klausur WS 15/16 Angewandte Informatik Bachelor

Programmiertechnik II Klausur SS 2017 Angewandte Informatik Bachelor

Übung 10: Dynamische Datenstrukturen und Rekursion

16. Dynamische Datenstrukturen

Grundkonzepte java.util.list

Programmiertechnik II Klausur WS 2017/18 Angewandte Informatik Bachelor

Software Entwicklung 1

13. Dynamische Datenstrukturen

Programmiertechnik II Klausur SS 2017 Angewandte Informatik Bachelor

Einstieg in die Informatik mit Java

Programmieren I. Kapitel 13. Listen

Einführung in die Programmierung

JAVA KURS COLLECTION

Listen. Prof. Dr. Christian Böhm. in Zusammenarbeit mit Gefei Zhang. WS 07/08

Verkettete Datenstrukturen: Listen

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

Fallstudie: Online-Statistik

3 Dynamische Datenstrukturen

ADT: Verkettete Listen

Datenstrukturen sind neben Algorithmen weitere wichtige Bausteine in der Informatik

12. Dynamische Datenstrukturen

Übungsblatt Programmierung und Software-Entwicklung Generizität, Interfaces, Listen, Sortieralgorithmen & JUnit

ALP II Dynamische Datenmengen Datenabstraktion

Teil V. Generics und Kollektionen in Java

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe

Programmieren 2 Übung Semesterwoche 2

Datenstrukturen und Abstrakte Datentypen

Übung Algorithmen und Datenstrukturen

5.3 Doppelt verkettete Listen

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

1. Rekursive Algorithmen 2. Rekursive (dynamische) Datenstrukturen

Kapitel 11: Bäume. Beispiele Definition und Eigenschaften Implementierungen Durchlaufen von Bäumen Binäre Suchbäume

Institut für Programmierung und Reaktive Systeme 17. Juli Programmieren II. Übungsklausur

Einführung in die Programmierung

Spezielle Datenstrukturen

Abgabe: (vor 12 Uhr)

II.4.4 Exceptions - 1 -

1 Abstrakte Datentypen

12 Abstrakte Klassen, finale Klassen und Interfaces

ADT: Verkettete Listen

Abschnitt 10: Datenstrukturen

Algorithmen und Datenstrukturen (für ET/IT)

Faulheit professionell: Fertige Datenbehälter. Das Java-Collections-Framework Typsicherheit Generische Klassen

Hochschule Augsburg, Fakultät für Informatik Name:... Prüfung "Programmieren 1", IN1bac, WS 10/11 Seite 1 von 6

Einführung in die Programmierung mit Java

Programmieren 2 16 Java Collections und Generizität

Vorlesung Datenstrukturen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 17/18. Kapitel 14. Bäume. Bäume 1

Übungen zu Kapitel 18

Algorithmen und Datenstrukturen (für ET/IT) Wiederholung: Ziele der Vorlesung. Wintersemester 2012/13. Dr. Tobias Lasser

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 14. Bäume. Bäume 1

Einfach verkettete Liste

Kapitel 12: Induktive

13. Bäume: effektives Suchen und Sortieren

Transkript:

Kapitel 3: Datentyp Liste! Einleitung! Listen-Interface! Liste als Feld: ArrayList! Einfach verkettete Listen! Hilfskopfknotentechnik! Liste als einfach verkettete Liste: LinkedList! Doppelt verkettete Listen Prof. Dr. O. Bittel, HTWG Konstanz Programmiertechnik II Datentyp Liste WS 16/17 3-1

Listen und ihre Operationen Definition! Eine Liste ist eine endliche Folge von Elementen: a 0, a 1,, a n-1! Die Elemente einer Liste besitzen eine Position, wobei das erste Element die Position 0 besitzt (analog zu Feldern). Beispiele:! Einkaufslisten! Tagesordnungen!... Milch Eier Mehl Zucker Position: 0 1 2 3 Typische Operationen:! einfügen an eine Position! löschen einer Position! lesen einer Position! ändern einer Position Einfügen von Sahne an Position 1: Sahne Milch Eier Mehl Zucker Milch Sahne Eier Mehl Zucker Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-2

Listen-Interface public interface List { void add(int x); void add(int idx, int x); int set(int idx, int x); int get(int idx); void remove(int idx); int size(); void clear(); boolean isempty();! add(x) fügt x hinten an; entspricht add(size(), x)! add(i, x) fügt an Position i das Element x ein.! set(i, x) überschreibt das Element an der Position i mit x. Der alte Wert wird zurückgeliefert.! get(i) liefert den Wert an der Position i.! remove(i) löscht die Position i.! size() ist die Anzahl Elemente in der Liste.! clear() löscht alle Elemente.! isempty() prüft, ob die Liste leer ist. Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-3

Jetzt nur int-liste; generische Liste später! In diesem Kapitel sollen vorerst nur int-listen behandelt werden.! Die Erweiterung auf beliebige Element-Typen geschieht später als generischer Listentyp. Generisches Listen-Interface: public interface List<E> { void add(e x); void add(int idx, E x); int set(int idx, E x); E get(int idx); void remove(int idx); int size(); void clear(); boolean isempty(); E steht für einen beliebigen Elementyp Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-4

Kapitel 3: Datentyp Liste! Einleitung! Listen-Interface! Liste als Feld: ArrayList! Einfach verkettete Listen! Hilfskopfknotentechnik! Liste als einfach verkettete Liste: LinkedList! Doppelt verkettete Listen Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-5

Liste als Feld: class ArrayList (1)! Die Realisierung einer Liste als Feld ist naheliegend! Elemente werden lückenlos im Feld gehalten. Beim Einfügen bzw. Löschen müssen die Elemente verschoben werden.! Falls das Feld gefüllt ist, muss das Feld vergrößert werden, d.h. umkopieren in ein größeres Feld. Liste Liste als Feld: 12 78 5 16 data[0] data[1]... data[size-1] 12 78 5 16 hier ist size = 4... data[n-1] Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-6

Liste als Feld: class ArrayList (2) public class ArrayList implements List { public ArrayList() { clear(); public final void clear() { size = 0; data = new int[def_capacity]; Methode ist final und kann damit durch Klassenerweiterungen nicht mehr überschrieben werden. Wichtig, da das Verhalten des Konstruktors sich nicht mehr ändern sollte. public int size() {return size; public boolean isempty() {return size == 0; //... private static final int DEF_CAPACITY = 32; private int size; private int[] data; Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-7

Liste als Feld: class ArrayList (3) public class ArrayList implements List { //... public void add(int x) {add(size(), x); public void add(int idx, int x) { if (idx < 0 idx > size) throw new IndexOutOfBoundsException(); if (data.length == size) ensurecapacity(2*size); for (int i = size; i > idx; i--) { data[i] = data[i-1]; data[idx] = x; size++; private void ensurecapacity(int newcapacity) { if (newcapacity < size) return; int[] old = data; data = new int[newcapacity]; System.arraycopy(old, 0, data, 0, size); Precondition prüfen. Feld verdoppeln, falls kein Platz mehr ist. Elemente um eine Position nach rechts verschieben. Feld in ein größeres Feld kopieren. Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-8

Liste als Feld: class ArrayList (4) public class ArrayList implements List { //... public int set(int idx, int x) { if (idx < 0 idx >= size) throw new IndexOutOfBoundsException(); int old = data[idx]; data[idx] = x; return old; public int get(int idx) { if (idx < 0 idx >= size) throw new IndexOutOfBoundsException(); return data[idx]; public void remove(int idx) { if (idx < 0 idx >= size) throw new IndexOutOfBoundsException(); for (int i = idx; i < size-1; i++) data[i] = data[i+1]; size--; Elemente um eine Position nach links verschieben. Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-9

Liste als Feld: class ArrayList (5) public class ArrayList implements List { //... @Override public String tostring() { StringBuilder s = new StringBuilder(""); for (int i = 0; i < size; i++) { s.append(data[i]).append(", "); s.append("size = ").append(size); return s.tostring(); Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-10

Liste als Feld: class ArrayList (6) public static void main(string[] args) { List l = new ArrayList(); l.add(5); l.add(3); l.add(2); l.add(0,12); System.out.println(l); System.out.println(l.get(1)); System.out.println(l.set(1,13)); System.out.println(l.get(1)); System.out.println(l); 12, 5, 3, 2, size = 4 5 5 13 12, 13, 3, 2, size = 4 l.remove(1); System.out.println(l); 12, 3, 2, size = 3 Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-11

Aufgaben zu ArrayList Aufgabe 3.1 Erweitern Sie das Interface List und die Klasse ArrayList um eine Methode append(list list), die eine weitere Liste list anhängt. Aufgabe 3.2 Realisieren Sie einen Konstruktor ArrayList(List list), der die Liste mit list initialisiert. Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-12

Bemerkungen! Dynamisch wachsende Listen erfordert teures Kopieren in größere Felder. Falls Feldgrößen verdoppelt werden (wie hier), ist das Umkopieren nicht so häufig notwendig. (Frage: wie oft muss das Feld verdoppelt, werden, damit ca. 1 Million Elemente abgespeichert werden können, wenn die Anfangsgröße 2 7 = 128 ist?). Die Verdopplung der Feldgrößen geht jedoch auf Kosten von nicht benötigtem Speicherplatz.! Bei schrumpfenden Listen findet keine Anpassung der Felder statt; das ließe sich jedoch durch Umkopieren in kleinere Felder realisieren.! Zugriff und Ändern von Elementen ist sehr effizient gelöst.! Einfügen und Löschen von Elementen ist mit teurem Verschieben verbunden. Besonders teuer ist das Einfügen und Löschen am Listenanfang.! Daher sind oft verkettete Listen (nächste Folie) die bessere Alternative. Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-13

Kapitel 3: Datentyp Liste! Einleitung! Listen-Interface! Liste als Feld: ArrayList! Einfach verkettete Listen! Hilfskopfknotentechnik! Liste als einfach verkettete Liste: LinkedList! Doppelt verkettete Listen Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-14

Begriffe Verkettete Listen! Eine linear verkettete Liste besteht aus einer Folge von Elementen, die über jeweils eine Referenz auf das nächste Element verkettet sind.! Element und Referenz auf das nächste Element nennt man auch Knoten (engl. node).! Es gibt eine Referenz auf den ersten Knoten: wird oft head genannt.! Letzter Knoten enthält die null-referenz. Beispiel! Liste mit 5 Knoten: head! leere Liste: 2 5 3 1 7 Knoten null head Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-15

Datentyp Node Knotentyp Node: class Node { private Node next; private int data; public Node(int x, Node p) { data = x; next = p; Knoten erzeugen: Node head = new Node(3,null); head 3 Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-16

Liste aufbauen durch Einfügen am Anfang Node head = new Node(3,null); head 3 head = new Node(5,head); head 5 3 head = new Node(1,head); head 1 5 3! die drei oberen Anweisungen lassen sich auch in eine Anweisung zusammenfassen: head = new Node(1, new Node(5, new Node(3,null))); Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-17

Liste durch Schleife aufbauen Scanner in = new Scanner(System.in); Node head = null; System.out.println("Eingabe: "); while (in.hasnextint()) { int x = in.nextint(); head = new Node(x,head); Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-18

Liste durchlaufen Liste ausgeben: for (Node p = head; p!= null; p = p.next) { System.out.println(p.data); Liste nach x durchsuchen: Node p; for (p = head; p!= null; p = p.next) { if (p.data == x) break; if (p!= null) System.out.println(x + " gefunden"); else System.out.println(x + " nicht gefunden"); Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-19

Einfügen nach einem beliebigen Knoten! Es wird zunächst eine Referenz p auf den Knoten positioniert, nach dem eingefügt werden soll. p 2 7 3! Einfügen nach p: p 2 7 3 p.next = new Node(5,p.next); 5 Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-20

Löschen nach einem beliebigen Knoten! Es wird zunächst eine Referenz p auf den Knoten positioniert, nach dem ein Knoten gelöscht werden soll. Es muss daher p.next!= null gelten. p 3 5! Löschen des Knotens nach p: p 3 5 p.next = p.next.next; Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-21

Einfügen in sortierte Liste (1)! Allgemeiner Fall beim Einfügen von x: p head 1 3 5 8 4! Sonderfälle beim Einfügen von x: - Einfügen in leere Liste (d.h. head == null) - Einfügen am Anfang (d.h. x <= head.data) head head 3 5 8 5 1 Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-22

Einfügen in sortierte Liste (2) // Einfügen von x in sortierte Liste head: if (head == null x <= head.data) { Sonderfälle: head = new Node(x,head); Einfügen in leere Liste else { Einfügen am Listenanfang Node p = head; while(p.next!= null && p.next.data < x) { p = p.next; p.next = new Node(x,p.next); Allgemeiner Fall: Einfügen nach einem Knoten head p 1 3 5 8 4 Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-23

Listen mit Hilfskopfknoten! Am Anfang der Liste wird zusätzlich ein nicht-datenspeichernder Knoten (Hilfskopfknoten; engl. dummy head node) eingefügt.! Die leere Liste besteht damit genau aus einem Hilfskopfknoten.! Vorteil: In der Regel keine Sonderfälle bei leerer Liste und Behandlung des ersten Datenknotens. Liste mit einem Hilfskopfknoten und 3 Daten-Knoten: head 5 3 7 Leere Liste: Enthält keinen Daten-Knoten. head Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-24

Einfügen in sortierte Liste mit Hilfskopfknoten // Einfügen von x in sortierte Liste head: Node p = head; while(p.next!= null && p.next.data < x) { p = p.next; p.next = new Node(x,p.next); p p p head head 2 3 head 2 3 7 1 Einfügen in leere Liste 1 Einfügen am Listenanfang 4 Einfügen nach einem Datenknoten Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-25

Kapitel 3: Datentyp Liste! Einleitung! Listen-Interface! Liste als Feld: ArrayList! Einfach verkettete Listen! Hilfskopfknotentechnik! Liste als einfach verkettete Liste: LinkedList! Doppelt verkettete Listen Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-26

Datentyp Liste als einfach verkettete Liste! Realisierung einer Liste als einfach verkettete Liste mit Hilfskopfknoten, um Sonderfälle bei den verschiedenen Operationen zu vermeiden. Liste Liste als einfach verkettete Liste : 12 78 5 16 head 12 78 5 16 Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-27

class LinkedList (1) public class LinkedList implements List { public LinkedList() {clear(); public final void clear() { head = new Node(0,null); size = 0; Konstruktor legt leere Liste mit Hilfskopfknoten an. head //... static private class Node { private Node next; private int data; public Node(int x, Node p) { data = x; next = p; private Node head; private int size; Statisch geschachtelte Klasse Node: Verhält sich wie eine Top-Level- Klasse, jedoch hat LinkedList volle Zugriffsrechte auf Node. Listenobjekt besteht aus head- Referenz für verkettete Liste und Anzahl der Listenelemente. Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-28

class LinkedList (2) public class LinkedList implements List { //... public int size() { return size; public boolean isempty() { return size == 0; public void add(int x) { add(size(), x); public void add(int idx, int x) { if (idx < 0 idx > size) throw new IndexOutOfBoundsException(); Node p = head; for (int i = 0; i < idx; i++) p = p.next; p.next = new Node(x,p.next); size++; Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-29

class LinkedList (3) public class LinkedList implements List { //... public int set(int idx, int x) { if (idx < 0 idx >= size) throw new IndexOutOfBoundsException(); Node p = head.next; for (int i = 0; i < idx; i++) p = p.next; int old = p.data; p.data = x; return old; public int get(int idx) { if (idx < 0 idx >= size) throw new IndexOutOfBoundsException(); Node p = head.next; for (int i = 0; i < idx; i++) p = p.next; return p.data; Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-30

class LinkedList (4) public class LinkedList implements List { //... public void remove(int idx) { if (idx < 0 idx >= size) throw new IndexOutOfBoundsException(); Node p = head; for (int i = 0; i < idx; i++) p = p.next; p.next = p.next.next; size--; @Override public String tostring() { StringBuilder s = new StringBuilder(""); for (Node p = head.next; p!= null; p = p.next) { s.append(p.data).append(", "); s.append("size = ").append(size); return s.tostring(); Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-31

class LinkedList (5) public static void main(string[] args) { List l = new LinkedList(); l.add(5); l.add(3); l.add(2); l.add(0,12); System.out.println(l); System.out.println(l.get(1)); System.out.println(l.set(1,13)); System.out.println(l.get(1)); System.out.println(l); 12, 5, 3, 2, size = 4 5 5 13 12, 13, 3, 2, size = 4 l.remove(1); System.out.println(l); 12, 3, 2, size = 3 Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-32

Aufgaben zu LinkedList Aufgabe 3.3 Erweitern Sie die Klasse LinkedList um eine Methode removeelement(int x), die aus der Liste das erste Element mit dem Wert x löscht. Aufgabe 3.4 Erweitern Sie die Klasse LinkedList um eine Methode removeallelement(int x), die aus der Liste alle Elemente mit dem Wert x löscht. Aufgabe 3.5 Erweitern Sie die Klasse LinkedList um eine Methode append(list list), die eine weitere Liste list anhängt. Aufgabe 3.6 Realisieren Sie einen Konstruktor LinkedList(List list), der die verkettete Liste mit list initialisiert. Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-33

Kapitel 3: Datentyp Liste! Einleitung! Listen-Interface! Liste als Feld: ArrayList! Einfach verkettete Listen! Hilfskopfknotentechnik! Liste als einfach verkettete Liste: LinkedList! Doppelt verkettete Listen Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-34

Doppelt verkettete Liste begin 5 7 3 9... end! Jeder Knoten enthält zusätzlich einen Zeiger auf den Vorgängerknoten.! Damit effizienter Zugriff auf Vorgängerknoten möglich.! Oft ist auch Speicherung einer Referenz auf den letzten Knoten geschickt.! Andere Bezeichnungen: begin als Referenz auf den ersten Knoten und end als Referenz auf den letzten Knoten. class Node { private Node next; private Node prev; // previous private int data; public Node(int x, Node p, Node n) { data = x; next = n; prev = p; Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-35

Doppelt verkettete Liste mit Hilfsknoten (1)! Durch zusätzliche nicht datenspeichernde Hilfknoten am Anfang und am Ende werden Behandlung von Spezialfälle überflüssig. begin 7 3 9... end! Löschen eines Daten-Knotens p: p.prev.next = p.next; p.next.prev = p.prev; p 1) begin... 7 3 5 9 2) end Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-36

Doppelt verkettete Liste mit Hilfsknoten (2)! Einfügen eines neuen Knotens r nach einem Knoten q: Node r = new Node(x, q.next, q); r.next.prev = r; q.next = r; q begin 3)... 1) 7 3 5 9 end 1) 2) r 2 Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-37

Doppelt verkettete Liste mit Hilfsknoten (3)! Einfügen eines neuen Knotens r vor einem Knoten q: Node r = new Node(x, q, q.prev); r.prev.next = r; q.prev = r; q begin 2)... 1) 7 3 5 9 end r 1) 3) 2 Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-38

Aufgaben zu doppelt verketteten Listen Aufgabe 3.7 Die Klasse LinkedList soll zu einer doppelt verketteten Liste mit Hilfskopfknoten erweitert werden.! Ändern Sie die Methode clear().! Ändern Sie die Methode add(i,x) so ab, dass bei höheren Indexwerten i die Liste von hinten nach vorne durchlaufen wird. public class DoubleLinkedList implements List { static private class Node { private Node next; private Node prev; // previous private int data; public Node(int x, Node p, Node n){ data = x; next = n; prev = p; private Node begin; private Node end; private int size; //... Prof. Dr. O. Bittel, HTWG Konstanz Fortgeschrittene Programmiertechnik Datentyp Liste WS 16/17 3-39