Dada una lista enlazada individualmente, a partir del segundo Node, elimine todos los Nodes alternativos de la misma. Por ejemplo, si la lista enlazada dada es 1->2->3->4->5 entonces su función debería convertirla a 1->3->5, y si la lista enlazada dada es 1->2-> 3->4 luego conviértalo a 1->3.
Método 1 (iterativo):
realice un seguimiento de la anterior del Node que se eliminará. Primero, cambie el siguiente enlace del Node anterior y muévase iterativamente al siguiente Node.
C
// C program to remove alternate nodes // of a linked list #include<stdio.h> #include<stdlib.h> // A linked list node struct Node { int data; struct Node *next; }; // Deletes alternate nodes of a list // starting with head void deleteAlt(struct Node *head) { if (head == NULL) return; // Initialize prev and node to // be deleted struct Node *prev = head; struct Node *node = head->next; while (prev != NULL && node != NULL) { // Change next link of previous // node prev->next = node->next; // Free memory free(node); // Update prev and node prev = prev->next; if (prev != NULL) node = prev->next; } } // UTILITY FUNCTIONS TO TEST // fun1() and fun2() /* Given a reference (pointer to pointer) to the head of a list and an int, push a new node on the front of the list. */ void push(struct Node** head_ref, int new_data) { // Allocate node struct Node* new_node = (struct Node*) malloc(sizeof(struct Node)); // Put in the data new_node->data = new_data; // Link the old list off the // new node new_node->next = (*head_ref); // Move the head to point to // the new node (*head_ref) = new_node; } // Function to print nodes in a // given linked list void printList(struct Node *node) { while (node != NULL) { printf("%d ", node->data); node = node->next; } } // Driver code int main() { // Start with the empty list struct Node* head = NULL; /* Using push() to construct list 1->2->3->4->5 */ push(&head, 5); push(&head, 4); push(&head, 3); push(&head, 2); push(&head, 1); printf("\nList before calling deleteAlt() \n"); printList(head); deleteAlt(head); printf("\nList after calling deleteAlt() \n"); printList(head); return 0; }
Producción:
List before calling deleteAlt() 1 2 3 4 5 List after calling deleteAlt() 1 3 5
Complejidad de tiempo: O(n) donde n es el número de Nodes en la lista enlazada dada.
Método 2 (recursivo):
el código recursivo utiliza el mismo enfoque que el método 1. El código recursivo es simple y breve, pero hace que la función recursiva O(n) llame a una lista vinculada de tamaño n.
C
// Deletes alternate nodes of a list // starting with head void deleteAlt(struct Node *head) { if (head == NULL) return; struct Node *node = head->next; if (node == NULL) return; // Change the next link of head head->next = node->next; // Free memory allocated for node free(node); // Recursively call for the new // next of head deleteAlt(head->next); }
Complejidad de tiempo: O(n)
Consulte el artículo completo sobre Eliminar Nodes alternativos de una lista vinculada 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