Elimine todos los Nodes principales de una lista circular enlazada individualmente

Dada una lista circular enlazada individualmente que contiene N Nodes. La tarea es eliminar todos los Nodes de la lista que son primos.
 

Ejemplos: 

Entrada: 9->11->32->6->13->20 
Salida: 9 32 6 20 

Entrada: 6->11->16->21->17->10 
Salida: 6 16 21 10

Enfoque: La idea es recorrer los Nodes de la lista circular de enlaces sencillos uno por uno y obtener el puntero de los Nodes que son primos. Elimine esos Nodes siguiendo el enfoque utilizado en la publicación: Eliminar un Node de la lista enlazada circular .
A continuación se muestra la implementación de la idea anterior: 

A continuación se muestra la implementación del enfoque anterior:

C++

// CPP program to delete all prime
// node from a Circular singly linked list
 
#include <bits/stdc++.h>
using namespace std;
 
// Structure for a node
struct Node {
    int data;
    struct Node* next;
};
 
// Function to insert a node at the beginning
// of a Circular linked list
void push(struct Node** head_ref, int data)
{
    struct Node* ptr1
        = (struct Node*)malloc(sizeof(struct Node));
    struct Node* temp = *head_ref;
    ptr1->data = data;
    ptr1->next = *head_ref;
 
    // If linked list is not NULL then
    // set the next of last node
    if (*head_ref != NULL) {
        while (temp->next != *head_ref)
            temp = temp->next;
        temp->next = ptr1;
    }
    else
        ptr1->next = ptr1; // For the first node
 
    *head_ref = ptr1;
}
 
// Delete the node if it is prime
void deleteNode(Node* head_ref, Node* del)
{
    struct Node *temp = head_ref, *temp2 = head_ref;
    // traverse list till not found
    // delete node
    while (temp->next != del) {
        temp = temp->next;
    }
 
    // copy address of node
    temp->next = del->next;
 
    // Finally, free the memory
    // occupied by del
    free(del);
 
    return;
}
 
// Function to check if a number is prime
bool isPrime(int n)
{
    // Corner cases
    if (n <= 1)
        return false;
 
    if (n <= 3)
        return true;
 
    // This is checked so that we can skip
    // middle five numbers in below loop
    if (n % 2 == 0 || n % 3 == 0)
        return false;
 
    for (int i = 5; i * i <= n; i = i + 6)
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
 
    return true;
}
 
// Function to delete all prime nodes
// from the singly circular linked list
Node* deletePrimeNodes(Node* head)
{
   if (head == NULL)
        return NULL;
    struct Node* ptr = head;
 
    struct Node* temp;
 
    // setting up the head node to the first non prime node
    while (isPrime(ptr->data)) {
        ptr = ptr->next;
        if (ptr == head) {
            return NULL;
        }
    }
    temp = ptr;
    Node* temp2 = ptr;
    ptr = ptr->next;
    // setting up the last node next to the first non prime
    // node
    while (ptr != head) {
        temp2 = ptr;
        ptr = ptr->next;
    }
    temp2->next = temp;
    head = temp;
    ptr = head;
    // traverse list till the endl
    // if node is prime then delete it
    do {
        temp = ptr->next;
        // if node is prime
        if (isPrime(ptr->data))
            deleteNode(head, ptr);
        ptr = temp;
 
    } while (ptr != head);
    return head;
}
 
// Function to print nodes in a
// given singly linked list
void printList(struct Node* head)
{
    if (!head) {
        printf("NULL");
    }
    struct Node* temp = head;
    if (head != NULL) {
        do {
            printf("%d ", temp->data);
            temp = temp->next;
        } while (temp != head);
    }
}
 
// Driver code
int main()
{
    // Initialize lists as empty
    struct Node* head = NULL;
 
    // Created linked list will be
    // 9->11->32->6->13->20
    push(&head, 20);
    push(&head, 13);
    push(&head, 6);
    push(&head, 32);
    push(&head, 11);
    push(&head, 9);
 
    cout << "Given List : ";
    printList(head);
 
    cout << "\nList After deleting prime nodes : ";
    head = deletePrimeNodes(head);
    printList(head);
 
    return 0;
}

Java

// Java program to delete all prime
// node from a Circular singly linked list
class GFG
{
     
// Structure for a node
static class Node
{
    int data;
    Node next;
};
 
// Function to insert a node at the beginning
// of a Circular linked list
static Node push(Node head_ref, int data)
{
    Node ptr1 = new Node();
    Node temp = head_ref;
    ptr1.data = data;
    ptr1.next = head_ref;
 
    // If linked list is not null then
    // set the next of last node
    if (head_ref != null)
    {
        while (temp.next != head_ref)
            temp = temp.next;
        temp.next = ptr1;
    }
    else
        ptr1.next = ptr1; // For the first node
 
    head_ref = ptr1;
    return head_ref;
}
 
// Delete the node if it is prime
static Node deleteNode(Node head_ref, Node del)
{
    Node temp = head_ref;
 
    // If node to be deleted is head node
    if (head_ref == del)
        head_ref = del.next;
 
    // traverse list till not found
    // delete node
    while (temp.next != del)
    {
        temp = temp.next;
    }
 
    // copy address of node
    temp.next = del.next;
    return head_ref;
}
 
// Function to check if a number is prime
static boolean isPrime(int n)
{
    // Corner cases
    if (n <= 1)
        return false;
 
    if (n <= 3)
        return true;
 
    // This is checked so that we can skip
    // middle five numbers in below loop
    if (n % 2 == 0 || n % 3 == 0)
        return false;
 
    for (int i = 5; i * i <= n; i = i + 6)
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
 
    return true;
}
 
// Function to delete all prime nodes
// from the singly circular linked list
static Node deletePrimeNodes(Node head)
{
    Node ptr = head;
 
    Node next;
 
    // traverse list till the endl
    // if node is prime then delete it
    do
    {
        // if node is prime
        if (isPrime(ptr.data))
            deleteNode(head, ptr);
 
        // point to next node
        next = ptr.next;
        ptr = next;
 
    }
    while (ptr != head);
        return head;
}
 
// Function to print nodes in a
// given singly linked list
static void printList(Node head)
{
    Node temp = head;
    if (head != null)
    {
        do
        {
            System.out.printf("%d ", temp.data);
            temp = temp.next;
        }
        while (temp != head);
    }
}
 
// Driver code
public static void main(String args[])
{
    // Initialize lists as empty
    Node head = null;
 
    // Created linked list will be
    // 9.11.32.6.13.20
    head=push(head, 20);
    head=push(head, 13);
    head=push(head, 6);
    head=push(head, 32);
    head=push(head, 11);
    head=push(head, 9);
 
    System.out.println("Given List : ");
    printList(head);
 
    System.out.println( "\nList After deleting prime nodes : ");
    head=deletePrimeNodes(head);
    printList(head);
}
}
 
// This code is contributed by Arnab Kundu

Python3

# Python3 program to delete all prime
# node from a Circular singly linked list
import math
 
# Structure for a node
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
 
# Function to insert a node at the
# beginning of a Circular linked list
def push(head_ref, data):
    ptr1 = Node(data)
    temp = head_ref
    ptr1.data = data
    ptr1.next = head_ref
 
    # If linked list is not None then
    # set the next of last node
    if (head_ref != None) :
        while (temp.next != head_ref):
            temp = temp.next
        temp.next = ptr1
     
    else:
        ptr1.next = ptr1 # For the first node
 
    head_ref = ptr1
    return head_ref
 
# Delete the node if it is prime
def deleteNode(head_ref, delete):
    temp = head_ref
     
    # If node to be deleted is head node
    if (head_ref == delete):
        head_ref = delete.next
 
    # traverse list till not found
    # delete node
    while (temp.next != delete):
        temp = temp.next
     
    # copy address of node
    temp.next = delete.next
 
    # Finally, free the memory
    # occupied by delete
    # free(delete)
    return head_ref
 
# Function to check if a number is prime
def isPrime(n):
     
    # Corner cases
    if (n <= 1):
        return False
 
    if (n <= 3):
        return True
 
    # This is checked so that we can skip
    # middle five numbers in below loop
    if (n % 2 == 0 or n % 3 == 0):
        return False
 
    for i in range(5, n + 1, 6):
        if (i * i < n + 2 and
               (n % i == 0 or
                n % (i + 2) == 0)):
            return False
 
    return True
 
# Function to delete all prime nodes
# from the singly circular linked list
def deletePrimeNodes( head):
    ptr = head
 
    #next
 
    # traverse list till the endl
    # if node is prime then delete it
    # if (isPrime(ptr.data)!=True):
    # deleteNode(head, ptr)
 
    # point to next node
    next = ptr.next
    ptr = next
    while (ptr != head):
         
        # if node is prime
        if (isPrime(ptr.data) == True):
            deleteNode(head, ptr)
 
        # point to next node
        next = ptr.next
        ptr = next
 
    return head
 
# Function to print nodes in a
# given singly linked list
def printList(head):
    temp = head
    if (head != None) :
        print(temp.data, end = " ")
        temp = temp.next
        while (temp != head):
            print(temp.data, end = " ")
            temp = temp.next
     
# Driver code
if __name__=='__main__':
 
    # Initialize lists as empty
    head = None
 
    # Created linked list will be
    # 9.11.32.6.13.20
    head = push(head, 20)
    head = push(head, 13)
    head = push(head, 6)
    head = push(head, 32)
    head = push(head, 11)
    head = push(head, 9)
 
    print("Given List : ", end = "")
    printList(head)
 
    print( "\nList After deleting",
           "prime nodes : ", end = "")
    head = deletePrimeNodes(head)
    printList(head)
 
# This code is contributed by Srathore

C#

// C# program to delete all prime
// node from a Circular singly linked list
using System;
 
class GFG
{
     
// Structure for a node
public class Node
{
    public int data;
    public Node next;
};
 
// Function to insert a node at the beginning
// of a Circular linked list
static Node push(Node head_ref, int data)
{
    Node ptr1 = new Node();
    Node temp = head_ref;
    ptr1.data = data;
    ptr1.next = head_ref;
 
    // If linked list is not null then
    // set the next of last node
    if (head_ref != null)
    {
        while (temp.next != head_ref)
            temp = temp.next;
        temp.next = ptr1;
    }
    else
        ptr1.next = ptr1; // For the first node
 
    head_ref = ptr1;
    return head_ref;
}
 
// Delete the node if it is prime
static Node deleteNode(Node head_ref, Node del)
{
    Node temp = head_ref;
 
    // If node to be deleted is head node
    if (head_ref == del)
        head_ref = del.next;
 
    // traverse list till not found
    // delete node
    while (temp.next != del)
    {
        temp = temp.next;
    }
 
    // copy address of node
    temp.next = del.next;
    return head_ref;
}
 
// Function to check if a number is prime
static bool isPrime(int n)
{
    // Corner cases
    if (n <= 1)
        return false;
 
    if (n <= 3)
        return true;
 
    // This is checked so that we can skip
    // middle five numbers in below loop
    if (n % 2 == 0 || n % 3 == 0)
        return false;
 
    for (int i = 5; i * i <= n; i = i + 6)
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
 
    return true;
}
 
// Function to delete all prime nodes
// from the singly circular linked list
static Node deletePrimeNodes(Node head)
{
    Node ptr = head;
 
    Node next;
 
    // traverse list till the endl
    // if node is prime then delete it
    do
    {
        // if node is prime
        if (isPrime(ptr.data))
            deleteNode(head, ptr);
 
        // point to next node
        next = ptr.next;
        ptr = next;
 
    }
    while (ptr != head);
        return head;
}
 
// Function to print nodes in a
// given singly linked list
static void printList(Node head)
{
    Node temp = head;
    if (head != null)
    {
        do
        {
            Console.Write("{0} ", temp.data);
            temp = temp.next;
        }
        while (temp != head);
    }
}
 
// Driver code
public static void Main()
{
    // Initialize lists as empty
    Node head = null;
 
    // Created linked list will be
    // 9.11.32.6.13.20
    head=push(head, 20);
    head=push(head, 13);
    head=push(head, 6);
    head=push(head, 32);
    head=push(head, 11);
    head=push(head, 9);
 
    Console.WriteLine("Given List : ");
    printList(head);
 
    Console.WriteLine( "\nList After deleting prime nodes : ");
    head=deletePrimeNodes(head);
    printList(head);
}
}
 
/* This code contributed by PrinciRaj1992 */

Javascript

<script>
 
// JavaScript program to delete all prime
// node from a Circular singly linked list
 
// Structure for a node
class Node {
    constructor() {
        this.data = 0;
        this.next = null;
    }
}
 
    // Function to insert a node at the beginning
    // of a Circular linked list
    function push(head_ref , data) {
    var ptr1 = new Node();
    var temp = head_ref;
        ptr1.data = data;
        ptr1.next = head_ref;
 
        // If linked list is not null then
        // set the next of last node
        if (head_ref != null) {
            while (temp.next != head_ref)
                temp = temp.next;
            temp.next = ptr1;
        } else
            ptr1.next = ptr1; // For the first node
 
        head_ref = ptr1;
        return head_ref;
    }
 
    // Delete the node if it is prime
    function deleteNode(head_ref,  del) {
    var temp = head_ref;
 
        // If node to be deleted is head node
        if (head_ref == del)
            head_ref = del.next;
 
        // traverse list till not found
        // delete node
        while (temp.next != del) {
            temp = temp.next;
        }
 
        // copy address of node
        temp.next = del.next;
        return head_ref;
    }
 
    // Function to check if a number is prime
    function isPrime(n) {
        // Corner cases
        if (n <= 1)
            return false;
 
        if (n <= 3)
            return true;
 
        // This is checked so that we can skip
        // middle five numbers in below loop
        if (n % 2 == 0 || n % 3 == 0)
            return false;
 
        for (i = 5; i * i <= n; i = i + 6)
            if (n % i == 0 || n % (i + 2) == 0)
                return false;
 
        return true;
    }
 
    // Function to delete all prime nodes
    // from the singly circular linked list
    function deletePrimeNodes(head) {
    var ptr = head;
 
    var next;
 
        // traverse list till the endl
        // if node is prime then delete it
        do {
            // if node is prime
            if (isPrime(ptr.data))
                deleteNode(head, ptr);
 
            // point to next node
            next = ptr.next;
            ptr = next;
 
        } while (ptr != head);
        return head;
    }
 
    // Function to print nodes in a
    // given singly linked list
    function printList(head) {
    var temp = head;
        if (head != null) {
            do {
                document.write( temp.data+" ");
                temp = temp.next;
            } while (temp != head);
        }
    }
 
    // Driver code
     
        // Initialize lists as empty
    var head = null;
 
        // Created linked list will be
        // 9.11.32.6.13.20
        head = push(head, 20);
        head = push(head, 13);
        head = push(head, 6);
        head = push(head, 32);
        head = push(head, 11);
        head = push(head, 9);
 
        document.write("Given List : <br/>");
        printList(head);
 
        document.write(
        "<br/>List After deleting prime nodes : <br/>"
        );
        head = deletePrimeNodes(head);
        printList(head);
 
// This code contributed by aashish1995
 
</script>
Producción

Given List : 9 11 32 6 13 20 
List After deleting prime nodes : 9 32 6 20 

Complejidad de tiempo: O(N * sqrt(N))
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por Rajput-Ji 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 *