Introducció
Les llistes enllaçades són una estructura de dades fonamental que permet emmagatzemar una col·lecció d'elements de manera dinàmica. A diferència de les llistes estàtiques (com els arrays), les llistes enllaçades no requereixen una mida fixa i poden créixer o reduir-se segons sigui necessari.
Característiques Principals
-
Nodes: Cada element d'una llista enllaçada es diu node. Cada node conté dues parts:
- Dada: L'element que s'emmagatzema.
- Enllaç: Un punter o referència al següent node de la llista.
-
Cap: El primer node de la llista es coneix com a cap (head). Si la llista està buida, el cap és
null
. -
Dinàmica: Les llistes enllaçades poden créixer i reduir-se dinàmicament, ja que els nodes es creen i s'eliminen segons sigui necessari.
Tipus de Llistes Enllaçades
- Llista Enllaçada Simple: Cada node apunta només al següent node.
- Llista Doblement Enllaçada: Cada node apunta tant al següent com al node anterior.
- Llista Enllaçada Circular: L'últim node apunta al primer node, formant un cercle.
Implementació d'una Llista Enllaçada Simple
Estructura del Node
En una llista enllaçada simple, cada node conté una dada i un enllaç al següent node. A continuació es mostra una implementació bàsica en Python:
Estructura de la Llista Enllaçada
La classe de la llista enllaçada conté un punter al cap de la llista i mètodes per a les operacions bàsiques com afegir, eliminar i cercar elements.
class LinkedList: def __init__(self): self.head = None def is_empty(self): return self.head is None def append(self, data): new_node = Node(data) if self.is_empty(): self.head = new_node else: current = self.head while current.next: current = current.next current.next = new_node def display(self): current = self.head while current: print(current.data, end=" -> ") current = current.next print("None")
Operacions Bàsiques
Afegir un Element
Per afegir un element al final de la llista, es crea un nou node i es recorre la llista fins trobar l'últim node, al qual se li assigna el nou node com a següent.
def append(self, data): new_node = Node(data) if self.is_empty(): self.head = new_node else: current = self.head while current.next: current = current.next current.next = new_node
Eliminar un Element
Per eliminar un element, es recorre la llista fins trobar el node amb la dada desitjada i es modifica l'enllaç del node anterior per saltar-se el node a eliminar.
def delete(self, key): current = self.head previous = None while current and current.data != key: previous = current current = current.next if previous is None: self.head = current.next elif current: previous.next = current.next current.next = None
Cercar un Element
Per cercar un element, es recorre la llista fins trobar el node amb la dada desitjada.
def search(self, key): current = self.head while current and current.data != key: current = current.next return current is not None
Exemple Complet
A continuació es mostra un exemple complet de com utilitzar la classe LinkedList
:
if __name__ == "__main__": ll = LinkedList() ll.append(1) ll.append(2) ll.append(3) ll.display() # Output: 1 -> 2 -> 3 -> None ll.delete(2) ll.display() # Output: 1 -> 3 -> None print(ll.search(3)) # Output: True print(ll.search(2)) # Output: False
Exercicis Pràctics
Exercici 1: Afegir al Principi
Implementa un mètode prepend
que afegeixi un element al principi de la llista.
Exercici 2: Invertir la Llista
Implementa un mètode reverse
que inverteixi la llista enllaçada.
def reverse(self): previous = None current = self.head while current: next_node = current.next current.next = previous previous = current current = next_node self.head = previous
Exercici 3: Comptar Elements
Implementa un mètode count
que compti el nombre de nodes en la llista.
def count(self): current = self.head count = 0 while current: count += 1 current = current.next return count
Conclusió
Les llistes enllaçades són una estructura de dades versàtil i eficient per a moltes aplicacions. La seva implementació i manipulació requereix una comprensió clara dels punters i la gestió dinàmica de la memòria. Amb les operacions bàsiques i els exercicis pràctics proporcionats, hauríeu de tenir una bona base per treballar amb llistes enllaçades en els vostres projectes de programació.
Curs d'Estructures de Dades
Mòdul 1: Introducció a les Estructures de Dades
- Què són les Estructures de Dades?
- Importància de les Estructures de Dades en la Programació
- Tipus d'Estructures de Dades
Mòdul 2: Llistes
- Introducció a les Llistes
- Llistes Enllaçades
- Llistes Doblement Enllaçades
- Llistes Circulars
- Exercicis amb Llistes
Mòdul 3: Piles
- Introducció a les Piles
- Operacions Bàsiques amb Piles
- Implementació de Piles
- Aplicacions de les Piles
- Exercicis amb Piles
Mòdul 4: Cues
- Introducció a les Cues
- Operacions Bàsiques amb Cues
- Cues Circulars
- Cues de Prioritat
- Exercicis amb Cues
Mòdul 5: Arbres
- Introducció als Arbres
- Arbres Binàries
- Arbres Binàries de Cerca
- Arbres AVL
- Arbres B
- Exercicis amb Arbres
Mòdul 6: Grafs
- Introducció als Grafs
- Representació de Grafs
- Algoritmes de Cerca en Grafs
- Algoritmes de Camins Mínims
- Aplicacions dels Grafs
- Exercicis amb Grafs