Cuando trabajamos con listas doblemente enlazadas en C++, es importante asegurarnos de que no se agreguen elementos duplicados. Para lograrlo, podemos implementar un método de búsqueda antes de la inserción y evitar que un nodo con el mismo valor se agregue más de una vez.
Para evitar elementos repetidos en la lista doblemente enlazada, debemos modificar el método insertar()
para verificar si el dato ya existe antes de agregar un nuevo nodo. Esto se puede hacer implementando una función buscar(int look)
que recorra la lista y devuelva true
si el elemento ya está presente.
A continuación, te muestro la implementación corregida:
#pragma once
#include <iostream>
#include "Node.h"
using namespace std;
class Lista {
public:
void insertar(int data);
bool buscar(int look);
void imprimir();
Lista();
~Lista();
private:
Node* head_n;
};
// Método para buscar un valor en la lista
bool Lista::buscar(int look) {
Node* cur_n = head_n;
while (cur_n != nullptr) {
if (cur_n->data == look) {
return true; // Se encontró el valor en la lista
}
cur_n = cur_n->next_n;
}
return false; // No se encontró el valor
}
// Método para insertar un nodo en la lista evitando duplicados
void Lista::insertar(int data) {
// Verificar si el dato ya existe
if (buscar(data)) {
cout << "El elemento " << data << " ya existe en la lista." << endl;
return;
}
Node* nwNode = new Node(data);
if (head_n == nullptr) {
head_n = nwNode;
return;
}
Node* cur_n = head_n;
while (cur_n->next_n != nullptr && cur_n->data < data) {
cur_n = cur_n->next_n;
}
if (cur_n == head_n) {
nwNode->next_n = head_n;
head_n->prev_n = nwNode;
head_n = nwNode;
}
else if (cur_n == nullptr) {
Node* aux = head_n;
while (aux->next_n != nullptr) {
aux = aux->next_n;
}
aux->next_n = nwNode;
nwNode->prev_n = aux;
}
else {
nwNode->next_n = cur_n;
nwNode->prev_n = cur_n->prev_n;
cur_n->prev_n->next_n = nwNode;
cur_n->prev_n = nwNode;
}
}
1. Se implementa la función buscar(int look)
:
true
; de lo contrario, retorna false
.
2. Modificación en insertar(int data)
:
buscar(data)
.
int main() {
Lista miLista;
miLista.insertar(10);
miLista.insertar(20);
miLista.insertar(30);
miLista.insertar(20); // No se agregará porque ya existe
return 0;
}
El elemento 20 ya existe en la lista.
La mejor manera de evitar elementos repetidos en una lista doblemente enlazada en C++ es implementar una función de búsqueda que verifique la existencia de un valor antes de insertarlo. Con este enfoque, nos aseguramos de mantener la integridad de la lista y evitar datos duplicados.
Jorge García
Fullstack developer