edubun
Nederlands

Gelinkte lijsten

Vooraan een gelinkte lijst een waarde toevoegen verandert twee verwijzingen, of de lijst nu 4 waarden of 4 miljoen bevat.

Waarden die naar de volgende wijzen

Een array bewaart waarden naast elkaar, waardoor de voorkant veranderen duur is. Een gelinkte lijst laat die regel los. Elke waarde staat in een eigen klein record, een knoop, en de knopen kunnen overal in het geheugen staan. De MIT-notities van 6.006 beschrijven een knoop met twee velden: het item en next, een verwijzing naar de volgende knoop. De lijst zelf onthoudt alleen de eerste knoop, de head. De next van de laatste knoop is null en markeert het einde.

Om de lijst te lezen begin je bij head en volg je next-verwijzingen één voor één, zoals een keten briefjes die elk zeggen waar het volgende verstopt ligt. Dat kost iets. Er bestaat geen formule voor het adres van de vierde knoop, dus de waarde op positie i krijgen betekent i + 1 knopen bezoeken. MIT geeft get at(i) voor een gelinkte lijst als O(n), terwijl de array het in één stap kon.

// one node per value: { value, next }
let head = null;
for (const v of [4, 30, 7, 12]) head = { value: v, next: head };
// walk the list
for (let n = head; n !== null; n = n.next) console.log(n.value); // 12, 7, 30, 4

De lijst veranderen door opnieuw te koppelen

De winst komt wanneer je de lijst verandert. Om vooraan een nieuwe waarde te zetten, maak je een knoop waarvan next de huidige head is en laat je head naar de nieuwe knoop wijzen. Twee gewijzigde verwijzingen en niets anders beweegt. De voorste knoop verwijderen is één wijziging: laat head naar head.next wijzen. Vergelijk dat met de array, waar dezelfde bewerkingen elke waarde verplaatsten.

In het midden zit het werk in de plek vinden. Om op positie i in te voegen, loop je naar de knoop ervoor (i bezoeken) en verander je dan dezelfde twee verwijzingen: new.next = prev.next en dan prev.next = new. De volgorde telt. Als je eerst prev.next instelt, gaat de rest van de lijst verloren omdat niets er meer naar wijst. In het lab is één stap een knoop bezoeken of een verwijzing wijzigen. Invoegen op positie 2 in een lijst van 4 knopen kost dus 2 bezoeken plus 2 wijzigingen, 4 stappen.

Laden

Sleep om te draaien. Scroll of knijp om te zoomen.

Een enkelvoudig gelinkte lijst van vier knopen. Kies met de schuifknop een positie en voeg in of verwijder; de teller scheidt bezochte knopen van gewijzigde verwijzingen. Met Zoeken loop je vanaf head tot je de waarde of null bereikt.
BewerkingArray (n waarden)Gelinkte lijst (n knopen)
Haal de waarde op positie i op1i + 1 bezoeken
Vooraan invoegenn verplaatsingen + 1 schrijfactie2 gewijzigde verwijzingen
Vooraan verwijderen1 leesactie + (n − 1) verplaatsingen1 gewijzigde verwijzing
Invoegen op positie i(n − i) verplaatsingen + 1 schrijfactiei bezoeken + 2 wijzigingen
Een waarde zoekenmaximaal n leesactiesmaximaal n bezoeken

Wanneer gebruik je er een?

Een gelinkte lijst past goed als de meeste wijzigingen plaatsvinden op een plek waar je al een verwijzing naar hebt, zoals vooraan, en je zelden positie i nodig hebt. Je kunt wachtrijen en stapels uit gelinkte lijsten bouwen en ook de ketens binnen een hashtabel in het volgende hoofdstuk. Er zijn varianten. Een dubbel gelinkte lijst geeft elke knoop ook een prev-verwijzing, zodat je achteruit kunt lopen en een knoop in één stap kunt verwijderen zodra je die hebt. Naast head ook een tail-verwijzing bijhouden maakt achteraan toevoegen goedkoop.

In dagelijks JavaScript schrijf je zelden een gelinkte lijst, omdat arrays goed zijn geoptimaliseerd en caches in moderne processors waarden naast elkaar bevoordelen. Het idee blijft belangrijk: bomen, grafen en veel bibliotheekstructuren worden precies zo uit knopen en verwijzingen opgebouwd.

AchtergrondGelinkte lijsten verschenen midden jaren 1950 met de Information Processing Language (IPL), rond 1956 geschreven door Allen Newell, Cliff Shaw en Herbert Simon bij de RAND Corporation en het Carnegie Institute of Technology. Hun programma's zochten bewijzen van logische stellingen en het aantal en de grootte van wat ze moesten onthouden waren vooraf onbekend. Lijsten van gekoppelde cellen lieten geheugen cel voor cel uitdelen en terugnemen. De lijstverwerking van IPL beïnvloedde Lisp, dat John McCarthy enkele jaren later ontwierp.
  1. Welke twee velden bevat een knoop van een enkelvoudig gelinkte lijst?
    • item en next
    • index en value
    • left en right
    • head en tail
  2. Lijst 12 → 7 → 30 → 4. Hoeveel stappen kost vooraan een nieuwe waarde invoegen (gewijzigde verwijzingen)?
  3. Dezelfde lijst: hoeveel stappen kost invoegen op positie 2 (bezoeken plus gewijzigde verwijzingen)?
  4. Dezelfde lijst: hoeveel knopen bezoekt zoeken naar 30?
  5. Dezelfde lijst: hoeveel knopen bezoekt zoeken naar 99 voordat null wordt bereikt?
  6. Dezelfde lijst: hoeveel stappen kost de knoop op positie 3 (de 4) verwijderen?
  7. Een array bevat 1000 waarden en heeft ruimte over. Hoeveel stappen kost vooraan invoegen?
  8. Welke taak past beter bij een gelinkte lijst dan bij een array?
    • Vaak de waarde op positie 500 lezen
    • Vaak vooraan toevoegen en verwijderen
    • Binair zoeken
    • Op index sorteren
  9. Welke volgorde behoudt de rest van de lijst bij invoegen na knoop p?
    • p.next = new en dan new.next = p.next
    • new.next = p.next en dan p.next = new
    • Beide volgorden werken
    • Verwijder eerst p
  10. Welke taal, rond 1956 bij RAND geschreven, introduceerde lijstverwerking met gekoppelde cellen?
    • Fortran
    • IPL
    • C
    • JavaScript
Belangrijkste punten
  • Een gelinkte lijst bewaart elke waarde in een knoop met een next-verwijzing; de lijst bewaart head.
  • Vooraan invoegen of verwijderen wijzigt 1 of 2 verwijzingen; niets beweegt.
  • Positie i bereiken kost i + 1 bezoeken, dus get at(i) is O(n).
  • Stel new.next in voordat je de voorgaande knoop opnieuw koppelt.
Bronnen van deze cursus (11)
  • MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
  • lecture notes 2 Data Structures (interface vs data structure, Sequence and Set interfaces, stack = insert_last/delete_last, queue = insert_last/delete_first, array, linked list, dynamic array, amortized Θ(1) append)
  • 4 Hashing (chaining, pigeonhole collisions, chain length n/m)
  • 6 Binary Trees Part 1 (height, traversal order, O(h) operations) and 7 Binary Trees Part 2: AVL (Adelson-Velsky and Landis, 1962) at ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes
  • MDN Web Docs, Array.prototype.shift (shifts all values left by 1)
  • Array.prototype.unshift, Map (insertion order, Map vs Object, spec requires sublinear average access) and Set (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects)
  • ECMAScript 2025 Language Specification (tc39.es/ecma262)
  • 24.1 Map Objects and 24.2 Set Objects ("must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements")
  • Array.prototype.shift steps (Repeat, while k < len: move element k to k - 1)
  • D. E. Knuth, The Art of Computer Programming vol. 3 (2nd ed. 1998) section 6.4 History (H. P. Luhn, IBM internal memorandum January 1953, hashing with chaining; digit pairs added mod 10, 31415926 -> 4548) via gwern.net copy, and IEEE Spectrum, "Hans Peter Luhn and the Birth of the Hashing Algorithm" (2018)
  • "A brief history of the stack", SIGCIS (sigcis.org/files/A brief history.pdf: Bauer and Samelson applied for the patent in 1957, US 3,047,228 granted July 31, 1962; IPL list processing by Newell, Simon and Shaw at RAND 1956) and Wikipedia, Information Processing Language (Newell, Shaw, Simon, RAND and Carnegie Institute of Technology, about 1956).

Geraadpleegd: 2026-10-18