Dada una lista enlazada ordenada, elimine todos los Nodes que tengan números duplicados (todas las ocurrencias), dejando solo los números que aparecen una vez en la lista original.
Ejemplos:
Input: 23->28->28->35->49->49->53->53 Output: 23->35 Input: 11->11->11->11->75->75 Output: empty List
Tenga en cuenta que esto es diferente de Eliminar duplicados de la lista vinculada
La idea es mantener un puntero (prev) al Node que está justo antes del bloque de Nodes que estamos buscando duplicados. En el primer ejemplo, el puntero anterior apuntaría a 23 mientras buscamos duplicados para el Node 28. Una vez que lleguemos al último Node duplicado con valor 28 ( nómbrelo puntero actual ), podemos hacer que el siguiente campo del Node anterior sea el next of current y actualice current=current.next . Esto eliminaría el bloque de Nodes con valor 28 que tiene duplicados.
Java
// Java program to remove all occurrences of // duplicates from a sorted linked list // class to create Linked lIst class LinkedList{ // Head of linked list Node head = null; class Node { // Value in the node int val; Node next; Node(int v) { // Default value of the next // pointer field val = v; next = null; } } // Function to insert data nodes into // the Linked List at the front public void insert(int data) { Node new_node = new Node(data); new_node.next = head; head = new_node; } // Function to remove all occurrences // of duplicate elements public void removeAllDuplicates() { // Create a dummy node that acts like // a fake head of list pointing to the // original head Node dummy = new Node(0); // Dummy node points to the original head dummy.next = head; Node prev = dummy; Node current = head; while (current != null) { // Until the current and previous values // are same, keep updating current while (current.next != null && prev.next.val == current.next.val) current = current.next; // If current has unique value i.e current // is not updated, Move the prev pointer // to next node if (prev.next == current) prev = prev.next; // When current is updated to the last // duplicate value of that segment, make // prev the next of current else prev.next = current.next; current = current.next; } // Update original head to the next of // dummy node head = dummy.next; } // Function to print the list elements public void printList() { Node trav = head; if (head == null) System.out.print(" List is empty" ); while (trav != null) { System.out.print(trav.val + " "); trav = trav.next; } } // Driver code public static void main(String[] args) { LinkedList ll = new LinkedList(); ll.insert(53); ll.insert(53); ll.insert(49); ll.insert(49); ll.insert(35); ll.insert(28); ll.insert(28); ll.insert(23); System.out.println( "Before removal of duplicates"); ll.printList(); ll.removeAllDuplicates(); System.out.println( "After removal of duplicates"); ll.printList(); } }
Producción:
List before removal of duplicates 23 28 28 35 49 49 53 53 List after removal of duplicates 23 35
Complejidad de tiempo: O (n) ¡
Consulte el artículo completo sobre Eliminar todas las ocurrencias de duplicados de una lista vinculada ordenada para obtener más detalles!
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA