Programa C para eliminar la última ocurrencia de un elemento de la lista vinculada

Usando punteros, recorra toda la lista y realice un seguimiento del Node anterior al Node que contiene la última clave de ocurrencia usando un puntero especial. Después de esto, simplemente almacene el siguiente del siguiente del puntero especial, en el siguiente del puntero especial para eliminar el Node requerido de la lista vinculada.

C

#include <stdio.h>
#include <stdlib.h>
 
// A linked list Node
struct Node
{
    int data;
    struct Node* next;
};
 
// Function to delete the last
// occurrence
void deleteLast(struct Node** head,
                int x)
{
    struct Node** tmp1 = NULL;
    while(*head)
    {
        if((*head)->data == x)
        {
            tmp1 = head;
        }
        head = &(*head)->next;
    }
    if(tmp1)
    {
        struct Node* tmp = *tmp1;
        *tmp1 = tmp->next;
        free(tmp);
    }
}
 
/* Utility function to create a
   new node with given key */
struct Node* newNode(int x)
{
    struct Node* node =
           malloc(sizeof(struct Node*));
    node->data = x;
    node->next = NULL;
    return node;
}
 
// This function prints contents of
// linked list starting from the given
// Node
void display(struct Node* head)
{
    struct Node* temp = head;
    if (head == NULL)
    {
        printf("NULL");
        return;
    }
    while (temp != NULL)
    {
        printf("%d --> ",
                temp->data);
        temp = temp->next;
    }
    printf("NULL");
}
 
// Driver code
int main()
{
    struct Node* head = newNode(1);
    head->next = newNode(2);
    head->next->next =
    newNode(3);
    head->next->next->next =
    newNode(4);
    head->next->next->next->next =
    newNode(5);
    head->next->next->next->next->next =
    newNode(4);
    head->next->next->next->next->next->next =
    newNode(4);
    printf("Created Linked list: ");
    display(head);
 
    // Pass the address of the head pointer
    deleteLast(&head, 4);  
    printf("List after deletion of 4: ");
    display(head);
    return 0;
}

Producción:

Created Linked list: 1 --> 2 --> 3 --> 4 --> 5 --> 4 --> 4 --> NULL
List after deletion of 4: 1 --> 2 --> 3 --> 4 --> 5 --> 4 --> NULL

Complejidad de tiempo: O(n) donde n es el número de Nodes en la lista enlazada dada.
Espacio auxiliar: O(1), no se requiere espacio adicional, por lo que es una constante.

La solución anterior no funciona cuando el Node que se eliminará es el último Node.
La siguiente solución maneja todos los casos. 

C

// A C program to demonstrate deletion
// of last Node in singly linked list
#include <stdio.h>
#include <stdlib.h>
 
// A linked list Node
struct Node
{
    int data;
    struct Node* next;
};
 
// Function to delete the last
// occurrence
void deleteLast(struct Node* head,
                int x)
{
    struct Node *temp = head,
                *ptr = NULL;
    while (temp)
    {
        // If found key, update
        if (temp->data == x)
            ptr = temp;       
        temp = temp->next;
    }
 
    // If the last occurrence is the
    // last node
    if (ptr != NULL &&
        ptr->next == NULL)
    {
        temp = head;
        while (temp->next != ptr)
            temp = temp->next;      
        temp->next = NULL;
    }
 
    // If it is not the last node
    if (ptr != NULL &&
        ptr->next != NULL)
    {
        ptr->data = ptr->next->data;
        temp = ptr->next;
        ptr->next = ptr->next->next;
        free(temp);
    }
}
 
/* Utility function to create a
   new node with given key */
struct Node* newNode(int x)
{
    struct Node* node =
           malloc(sizeof(struct Node*));
    node->data = x;
    node->next = NULL;
    return node;
}
 
// This function prints contents of
// linked list starting from the given
// Node
void display(struct Node* head)
{
    struct Node* temp = head;
    if (head == NULL)
    {
        printf("NULL");
        return;
    }
    while (temp != NULL)
    {
        printf("%d --> ", temp->data);
        temp = temp->next;
    }
    printf("NULL");
}
 
// Driver code
int main()
{
    struct Node* head = newNode(1);
    head->next = newNode(2);
    head->next->next = newNode(3);
    head->next->next->next =
    newNode(4);
    head->next->next->next->next =
    newNode(5);
    head->next->next->next->next->next =
    newNode(4);
    head->next->next->next->next->next->next =
    newNode(4);
    printf("Created Linked list: ");
    display(head);
    deleteLast(head, 4);
    printf("List after deletion of 4: ");
    display(head);
    return 0;
}

Producción: 

Created Linked List: 
1  2  3  4  5  4  4 
Linked List after Deletion of 1: 
1  2  3  4  5  4

Complejidad de tiempo: O(n) donde n es el número de Nodes en la lista enlazada dada.
Espacio auxiliar: O(1), no se requiere espacio adicional, por lo que es una constante.

Consulte el artículo completo sobre Eliminar la última aparición de un elemento de la 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *