Föreläsning 2. Länkad lista och iterator

Relevanta dokument
Föreläsning 2. Länkad lista och iterator

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning 4 Innehåll

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Föreläsning 3. Stack

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Föreläsning 3. Stack

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

Föreläsning 7. Träd och binära sökträd

Länkade strukturer. (del 2)

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Tommy Färnqvist, IDA, Linköpings universitet

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Algoritmer och datastrukturer. HI1029 8,0 hp Föreläsning 1

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 7. Träd och binära sökträd

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Länkade strukturer, parametriserade typer och undantag

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Föreläsning 3-4 Innehåll

Föreläsning 2 Datastrukturer (DAT037)

Generisk klass med typparameter Inre klass - ListIterator

Algoritmer och datastrukturer. HI1029 8,0 hp Föreläsning 1

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Programmering för språkteknologer II, HT2014. Rum

OOP Objekt-orienterad programmering

Datastrukturer. föreläsning 3. Stacks 1

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning Datastrukturer (DAT036)

Tentamen Programmering fortsättningskurs DIT950

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Föreläsning 2 Datastrukturer (DAT037)

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

DAT043 - föreläsning 8

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Samlingar Collection classes

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Laboration A Objektsamlingar

TDDC30 Programmering i Java, datastrukturer och algoritmer

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

So far... For recursive and iterative programs. Bubble, insertion, selection, quick, merge, counting

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

Objektorienterad Programmering (TDDC77)

Föreläsning 10. ADT:er och datastrukturer

Arrayer. results

Den som bara har en hammare tror att alla problem är spikar

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Tentamen Programmeringsteknik II

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Generiska datatyper. Parametrisk Polymorfism: Generics. Generisk lista. Utvikning: Typer

Saker du ska kunna Föreläsning 13 & 14

! Skall den vara generisk? ! Skall den vara självexpanderande? ! Skall vi ha en speciell klass för listnoder? ! osv

Föreläsning 2 Innehåll

Föreläsning 2 Innehåll. Generiska klasser. Generik i Java. Varför generiska klasser Bakgrund

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Objektorienterad Programkonstruktion

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 3 Datastrukturer (DAT037)

BST implementering, huvudstruktur

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

DAT043 Objektorienterad Programmering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

Föreläsning 8. Mängd, Avbildning, Hashtabell

Samlingar Collection classes

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

2. Palindrom. Exempel: 1,2,3,2,1 är ett palindrom, och även 0, men inte 1,2,3,1,2,3.

Föreläsning 9 Innehåll

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Föreläsning 10 Datastrukturer (DAT037)

Objektsamlingar i Java

Outline. Objektorienterad Programmering (TDDC77) Abstrakta klasser. Abstrakta metoder. Abstrakta klasser. Gränssnitt. Uppräkningar (enum) Ahmed Rezine

F 5. Representationer. Läsanvisning: kap Hur bra är länkade listor egentligen? enkellänkade listor dubbellänkade listor rekursiva listor

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Lösningsförslag till exempeltenta 1

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 8. Mängd, Avbildning, Hashtabell

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Föreläsning 12. Länkade listor

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Föreläsning 2 Innehåll

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Föreläsning 8: Exempel och problemlösning

Transkript:

Föreläsning 2 Länkad lista och iterator

Föreläsning 2 Länkad-lista Lista implementerad med en enkellänkad lista Iterator Implementering av en Iterator Dubbellänkad lista och cirkulär lista LinkedList JCF Iterator JCF Läsanvisningar och uppgifter

Länkad lista (enkellänkad) En länkad lista är en datastruktur där varje element ligger i en nod som håller reda på nästa nod. Datastrukturen består av en referens till första noden och kedjan av noder. Fördelarna med denna struktur jämfört med en array är att den kan växa dynamiskt det är effektivt att stoppa in eller ta ut element mitt i. Man behöver inte flytta massor med element utan bara ändra länkarna. Är platsen känd med referens är att ta bort eller sätta in element O(1) Nackdelarna är att Varje element kräver plats för en referens till nästa nod Om vi vill nå ett visst element måste vi gå igenom hela listan får att komma till det element vi önskar. Att hitta ett element är O(n)

Enkellänkad lista UML Ta bort ett element Lägga till ett element

Lista implementerad med en enkellänkad lista package singlelp; public class SingleLinkedList<E> { private static class Node<E> { private E data; private Node<E> next; public Node(E data, Node<E> next) { this.data = data; this.next = next; private Node<E> head; private int size; public SingleLinkedList(){ head = null; size = 0;

Gränssnitt Gränssnittet utåt för denna klass skall vara identiskt med vår arraylista. När man använder klassen ska man alltså inte behöva veta något om noder och länkar utan allt detta ska hanteras internt av klassen. Däremot för att använda den effektivt eller för att veta om man ska använda en arraylista istället behöver man förstå hur den fungerar. Låt oss börja med att lägga till element på plats index.

public void add(int index, E item) { if (index < 0 index > size) { throw new IndexOutOfBoundsException(Integer.toString(index)); if (index == 0) { addfirst(item); else { Node<E> node = getnode(index - 1); addafter(node, item);

SLList<String> Node<String> Node<String> head = next = data = "Tom" next = data = "Dick" private void addfirst(e item) { head = new Node<E>(item, head); size++; SLList<String> Node<String> Node<String> head = next = data = "Tom" next = data = "Dick" Node<String> next = data = "Ann"

//Returnerar null om noden saknas private Node<E> getnode(int index) { Node<E> node = head; for (int i = 0; i < index && node!= null; i++) { node = node.next; return node;

SLList<String> Node<String> Node<String> head = next = data = "Tom" next = data = "Dick" private void addafter(node<e> node, E item) { node.next = new Node<E>(item, node.next); size++; SLList<String> Node<String> Node<String> head = next = data = "Tom" next = data = "Dick" Node<String> next = data = "Ann"

I arraylistan var det naturligt att ha en metod som la till ett element sist i listan. Den är lättast att implementera och framförallt är den effektiv. Vill vi implementera List-interfacet även till denna behöver vi en sådan här med: public boolean add(e item) { add(size, item); return true; Men hur effektiv blir den? Vad händer om vi lägger till 10 element med denna till en tom lista? Hur kan vi förbättra effektiviteten?

public E get(int index) { if (index < 0 index >= size) { throw new IndexOutOfBoundsException(Integer.toString(index)); Node<E> node = getnode(index); return node.data; Även här får vi effektivitetsproblem om vi använder en for-loop och denna för att gå igenom en lista.

Traversera en lista @Override public String tostring() { StringBuilder sb = new StringBuilder("["); Node<E> p = head; if (p!= null) { while (p.next!= null) { sb.append(p.data.tostring()); sb.append(" ==> "); p = p.next; sb.append(p.data.tostring()); sb.append("]"); return sb.tostring(); Här ser man hur man går igenom en lista utan att behöva gå igenom listan igen för varje element. En ide vi behöver ta med oss för att kunna gå igenom en lista effektivt även utifrån.

Iterator En iterator låter oss gå igenom en listas element med O(1) för att få ut varje element istället för O(n) genom att helt enkelt hålla reda på var i listan vi är och sedan returnera nästa element så som vi kunde göra när vi gick igenom listan med den interna funktionen tostring().

Iterator - implementering private class Itr implements Iterator<E> {//nested class Node<E> current; public Itr(Node<E> start) { current = start; @Override public boolean hasnext() { return current!= null; @Override public E next() { if (current == null) { throw new NoSuchElementException(); E returnvalue = current.data; current = current.next; return returnvalue; @Override public void remove() { throw new UnsupportedOperationException();

//metod i SingleLinkedList<E> public Iterator<E> iterator() {//metod i return new Itr(head); // lägg också till att klassen implements Iterable<E>

Exempel iterator package singlelp; import java.util.iterator; public class SingleLinkedListTest { public static void main(string[] args) { SingleLinkedList<String> list = new SingleLinkedList<String>(); for(int i=1;i<=10;i++)//o(n 2 ) list.add("sträng "+i); Iterator<String> iter = list.iterator(); while(iter.hasnext())//o(n) System.out.println(iter.next());

Dubbellänkad lista I en dubbellänkad lista har varje nod en referens till både noden före och noden efter (dessutom både head och tail) Att sätta in sist blir O(n) istället för O(n 2 ) (kan åstadkommas med en länk tail till sista noden) Vi kan sätta in före och efter en nod vi har en referens till Vi kan ta bort en nod utan att ha en referens till noden innan Vi kan traversera listan åt bägge håll

Cirkulär lista Både en enkellänkad lista (och en dubbellänkad lista) kan göras cirkulär genom att länka sista noden till första (och första till sista) Vi kan traversera hela listan från godtyckligt element Riskerar inte att falla av listan Måste dock undvika oändliga loopar

Länkad lista i JCF (dubbellänkad) java.lang.object java.util.abstractcollection<e> java.util.abstractlist<e> java.util.abstractsequentiallist<e> java.util.linkedlist<e> All Implemented Interfaces:Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E>

JCF Iterator En iterator låter oss gå igenom, traversera, alla element i en Collection (tex en lista) med O(n) istället för O(n 2 ) Iterator<Integer> iter = alist.iterator(); while (iter.hasnext()) { int value = iter.next(); // Gör något med value istället för for(int index=0;index<alist.size();index++){ int value = alist.get(index); //Gör något med value Finns också enhanced for statement som använder iteratorn: for(int value: alist){ //Gör något med value

LinkedList<E> Iterator LinkedList implementerar Iterable och har därmed metoden: public Iterator<E> iterator() Iterator är ett interface med följande metoder:

Iterator koncept Tänk på en iterator som att den alltid befinner sig mellan noder:

Exempel - remove Du måste anropa next före varje remove: public static void removedivisibleby(linkedlist<integer> alist, int div) { Iterator<Integer> iter = alist.iterator(); while (iter.hasnext()) { int nextint = iter.next(); if (nextint % div == 0) { iter.remove();

ListIterator Listiterator<E> interfacet ärver från Iterator<E> och tillhandahåller utökad funktionalitet för de klasser såsom LinkedList som tillhandahåller en sådan. De två viktigaste förbättringarna är en add metod och att den kan traversera listan i bägge riktningarna För att få en sådan anropa listiterator(index). Se Java API för metoder.

Läsanvisning och uppgifter KW 2.5, (2.6), 2.7, (2.8), (2.9) Uppgifter: (SC Self Check, P Programing, PP Programing Projects, NB se sist i föreläsningen) Avsnitt 2.5: SC 1, NB 4(1p),5, 6(2p) Avsnitt 2.7: NB 7(2p)

Uppgifter NB 4 (1p) I den här uppgiften ska du träna på att programmera en länkad lista. Skapa en klass Node: public class Node{ public String data; public Node next; Skriv en main-klass där du direkt i main utan hjälp av funktioner skriver kod som skapar en länkad lista med datat: Gilgamesh - > löper -> på -> stäppen mha klassen Node. Skriv sedan en while-loop som går igenom listan och skriver ut innehållet i denna till standard out. Avsluta med att lägga till kod som tar bort på innan listan skrivs ut.

Uppgifter NB 5 Sätt ihop vår enkellänkade lista från föreläsningen. Skriv också en remove(index) metod till vår enkellänkade lista. Den ska returnera data från noden som tas bort. Skriv också en main-klass som testar funktionaliteten. Det finns förslag på hjälpfunktioner i boken men försök att lösa uppgiften själv.

NB 6 (2p) Lägg till en privat medlem tail i vår enkellänkade lista. Skriv om alla metoder från föreläsningen i klassen (alltså ej remove från NB 4) så att tail alltid refererar till sista noden. Gör om add() som lägger till ett element sist så att den nu utnyttjar tail för att bli O(1). I de flesta tillämpningar (men inte alla) är det värt att ha en tail-referens.

NB 7 (2p) Skriv själv remove metoden till vår iterator från föreläsningen. Obs att den inte kan anropa remove i vår länkade lista. Denna kommer ju då gå igenom hela listan för att komma till rätt nod och därmed förfela hela syftet med iteratorn.