从循环单链表中删除所有素数节点
给定一个包含 N 个节点的循环单链表。任务是从列表中删除所有素数节点。
例子:
Input : 9->11->32->6->13->20
Output : Given List : 9 11 32 6 13 20
List After delete prime node : 9 32 6 20
Input : 6->11->16->21->17->10
Output : Given List : 6 11 16 21 17 10
List After delete prime node : 10 21 16 6
方法:思路是逐个遍历循环单链表的节点,得到素数节点的指针。按照帖子中使用的方法删除这些节点:从循环链接列表中删除一个节点。
下面是上述思想的实现:
C++
// CPP program to delete all prime
// node from a Circular singly linked list
#include
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;
// 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;
// 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
void deletePrimeNodes(Node* head)
{
struct Node* ptr = head;
struct 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);
}
// Function to print nodes in a
// given singly linked list
void printList(struct Node* head)
{
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 : ";
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
输出:
Given List : 9 11 32 6 13 20
List After deleting prime nodes : 9 32 6 20