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_nodeEliminar 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 = NoneCercar 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 NoneExemple 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: FalseExercicis 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 = previousExercici 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 countConclusió
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
