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

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

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

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

Föreläsning 3. Stack

Föreläsning 3. Stack

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

Tommy Färnqvist, IDA, Linköpings universitet

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

Länkade strukturer, parametriserade typer och undantag

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

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

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

Länkade strukturer. (del 2)

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

Föreläsning 3-4 Innehåll

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

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

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

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

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

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

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Laboration A Objektsamlingar

Generisk klass med typparameter Inre klass - ListIterator

Samlingar Collection classes

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

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

TDDC30 Programmering i Java, datastrukturer och algoritmer

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

Föreläsning 2 Datastrukturer (DAT037)

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

Datastrukturer. föreläsning 3. Stacks 1

OOP Objekt-orienterad programmering

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

Tentamen Programmeringsteknik II

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

Tentamen Programmering fortsättningskurs DIT950

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

DAT043 - föreläsning 8

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

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

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

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

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

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

BST implementering, huvudstruktur

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

Föreläsning 3 Datastrukturer (DAT037)

DAT043 Objektorienterad Programmering

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 2 Innehåll

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

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

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

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

Objektorienterad Programkonstruktion

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

Arrayer. results

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

Föreläsning 9 Innehåll

Samlingar Collection classes

Tentamen i Algoritmer & Datastrukturer i Java

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

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

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

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

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

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

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

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 Programmering (TDDC77)

public boolean containskey(string key) { return search(key, head)!= null; }

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

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

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 25 maj 2009

Lösningsförslag till exempeltenta 1

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

Föreläsning 10 Datastrukturer (DAT037)

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

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

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

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

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

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Föreläsning Datastrukturer (DAT036)

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

Föreläsning 2 Innehåll

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

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

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

Objektsamlingar i Java

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Lösningsförslag till exempeltenta 2

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änkad lista (enkellänkad) En länkad lista är en datastruktur där varje element (data) ligger i en nod som håller reda på nästa nod. Observera att det endast är referenser (pekare) som ligger i listan. Objekten (i detta fall strängarna) ligger på heapen!

Implementering av lista med länkad lista jämfört med implementering med array Fördelarna den kan växa dynamiskt det är effektivt att stoppa in eller ta ut element mitt i. Har vi referensen till noden innan är att ta bort eller sätta in element O(1) Nackdelarna Varje element kräver plats för en referens till nästa nod Att hitta ett element är O(n)

Lägga till element först SLList<String> head = Node<String> next = data = "Tom" Node<String> next = data = "Dick" Node<String> next = data = "Ann"

Lägga till element mitt i listan SLList<String> head = Node<String> next = data = "Tom" Node<String> next = data = "Dick" Node<String> next = data = "Ann" Observera att vi måste ha en länk till noden före för att kunna ändra dess pekare

Implementering av en lista med en länkad lista 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.

Kod 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;

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);

private void addfirst(e item) { head = new Node<E>(item, head); size++; SLList<String> head = Node<String> next = data = "Tom" Node<String> 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;

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

Lägg till element sist Det är vanligt att fylla på en lista genom att sätta elementen sist. Det krävs också av List-interfacet. public boolean add(e item) { add(size, item); return true; När man implementerar en lista med en array är det mycket effektivt att lägga saker sist. Hur effektiv blir detta i en länkad lista? 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) per element Utan iterator får vi O(n) per element och vill vi gå igenom hela blir det O(n 2 ) Iteratorn åstadkommer detta genom att hålla reda på var i listan vi är På så sätt kan vi gå igenom en länkad lista lika effektivt som tostring men utan att behöva veta något om noder

Iterator - state Vid ett givet tillfälle har en iterator en pekare (current) som pekar på en av noderna (eller null) i listan. hasnext() returnerar current!=null next() returnerar current.data och flyttar fram current remove() tar bort det senast av next() returnerade elementet. tas bort av remove retur av next current Hit flyttas current om next anropas

Iterator - implementering private class Itr implements Iterator<E> {//nested class ligger i SingleLinkedList 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() { 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 head I en dubbellänkad lista har varje nod en referens till både noden före och noden efter Dessutom finns medlemsvariablerna head och tail + 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 + Att sätta in n st element sist i en tom lista blir O(n) tail - Listan tar 50% större plats Det sista kan enkelt åstadkommas i en enkellänkad lista genom att lägga till tail

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>

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

JCF Iterator En iterator traverserar alla element med O(n) 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 som blir O(n 2 ) Finns också enhanced for statement som använder iteratorn: for(int value: alist){ //Gör något med value

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> Tillhandahåller utökad funktionalitet Bla LinkedList tillhandahåller en ListIterator Viktigaste förbättringarna: add traversera listan i bägge riktningarna För att få en sådan anropa listiterator(index) Se Java API för alla metoder