从列表中删除所有可以被任何给定数 K 整除的节点
给定一个链表和一个键 K。任务是编写一个程序,从链表中删除所有可被 K 整除的节点。
例子:
Input : 12->15->9->11->5->6->7
K = 3
Output : 11 -> 5 -> 7
Input :13->4->16->9->22->45->5->16->6
K = 4
Output : 13 -> 9 -> 22 -> 45 -> 5 -> 6
解决这个问题的方法类似于从列表中删除小于给定键的所有节点。
有两种可能的情况:
- 头节点拥有一个可被 K 整除的值:首先检查头节点上所有可被 K 整除的值,删除它们并适当地更改头节点。
- 一些中间节点持有可被 k 整除的值:从头开始遍历并检查当前节点的值是否可被 K 整除。如果是,则删除该节点并在列表中向前移动。
下面是上述方法的实现:
C++
// C++ program to delete all the nodes from the list
// that are divisible by the specified value K
#include
using namespace std;
// Tree Node
struct Node {
int data;
Node* next;
};
// Function to create a new node
Node* getNode(int data)
{
Node* newNode = new Node;
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// Function to delete all the nodes from the list
// that divisible by the specified value K
void deleteDivisibleNodes(Node** head_ref, int K)
{
Node *temp = *head_ref, *prev;
// If head node itself holds the value divisible by K
while (temp != NULL && temp->data % K == 0) {
*head_ref = temp->next; // Changed head
free(temp); // free old head
temp = *head_ref; // Change temp
}
// Delete occurrences other than head
while (temp != NULL) {
// Search for the node to be deleted,
// keep track of the previous node as we
// need to change 'prev->next'
while (temp != NULL && temp->data % K != 0) {
prev = temp;
temp = temp->next;
}
// If required value node was not present
// in linked list
if (temp == NULL)
return;
// Unlink the node from linked list
prev->next = temp->next;
delete temp; // Free memory
// Update Temp for next iteration of
// outer loop
temp = prev->next;
}
}
// function to a print a linked list
void printList(Node* head)
{
while (head) {
cout << head->data << " ";
head = head->next;
}
}
// Driver code
int main()
{
// Create list: 12->15->9->11->5->6->7
Node* head = getNode(12);
head->next = getNode(15);
head->next->next = getNode(9);
head->next->next->next = getNode(11);
head->next->next->next->next = getNode(5);
head->next->next->next->next->next = getNode(6);
head->next->next->next->next->next->next = getNode(7);
int K = 3;
cout << "Initial List: ";
printList(head);
deleteDivisibleNodes(&head, K);
cout << "\nFinal List: ";
printList(head);
return 0;
}
Java
// Java program to delete all the nodes from the list
// that are divisible by the specified value K
import java.util.*;
class GFG
{
// Tree Node
static class Node
{
int data;
Node next;
};
// Function to create a new node
static Node getNode(int data)
{
Node newNode = new Node();
newNode.data = data;
newNode.next = null;
return newNode;
}
// Function to delete all the nodes from the list
// that divisible by the specified value K
static Node deleteDivisibleNodes(Node head_ref, int K)
{
Node temp = head_ref, prev = null;
// If head node itself holds the value divisible by K
while (temp != null && temp.data % K == 0)
{
head_ref = temp.next; // Changed head
//free(temp); // free old head
temp = head_ref; // Change temp
}
// Delete occurrences other than head
while (temp != null)
{
// Search for the node to be deleted,
// keep track of the previous node as we
// need to change 'prev.next'
while (temp != null && temp.data % K != 0)
{
prev = temp;
temp = temp.next;
}
// If required value node was not present
// in linked list
if (temp == null)
return head_ref;
// Unlink the node from linked list
prev.next = temp.next;
//delete temp; // Free memory
// Update Temp for next iteration of
// outer loop
temp = prev.next;
}
return null;
}
// function to a print a linked list
static void printList(Node head)
{
while (head != null)
{
System.out.print(head.data + " ");
head = head.next;
}
}
// Driver code
public static void main(String[] args)
{
// Create list: 12->15->9->11->5->6->7
Node head = getNode(12);
head.next = getNode(15);
head.next.next = getNode(9);
head.next.next.next = getNode(11);
head.next.next.next.next = getNode(5);
head.next.next.next.next.next = getNode(6);
head.next.next.next.next.next.next = getNode(7);
int K = 3;
System.out.print("Initial List: ");
printList(head);
head = deleteDivisibleNodes(head, K);
System.out.print("\nFinal List: ");
printList(head);
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python3 program to delete all the
# nodes from the list that are
# divisible by the specified value K
# Node class
class Node:
# Function to initialize the node object
def __init__(self, data):
self.data = data
self.next = None
# Linked List Class
class LinkedList:
# Function to initialize the
# LinkedList class.
def __init__(self):
# Initialize head as None
self.head = None
# This Method insert a new node
# at the End of the list
def push(self, new_data):
# Taking a pointer to iterate
ptr = self.head
# Making a new node with
# given data as it's element
new_node = Node(new_data)
# assigning the first node to
# head if list is empty or DNE
if(ptr == None):
self.head = new_node
# If list exits then..
else:
# Iteraring to the last
# node of the list
while(ptr.next != None):
ptr = ptr.next
# Attaching new node at
# the end of list
ptr.next = new_node
# Method to delete Nodes divisible
# by given integer.
def deleteDivisibleNodes(self, K):
# Declaring a temporary object
# containing address of head
temp = self.head
# Deleting the first node if it's
# data is divisible by given integer
# repeat till first node gets
# indivisible.
while(temp != None and
(temp.data % K) == 0):
self.head = temp.next
del(temp)
temp = self.head
# Now iterating through each node
# of the list.
while(temp != None):
# Checking if data in current node is
# divisible by given element and move
# to next node till it gets not divisible.
while(temp != None and
(temp.data % K) != 0):
prev = temp
temp = temp.next
# Returning if list ends
if(temp == None):
return
# Else storing address of next node
# in next of previous node
prev.next = temp.next
# And deleting the current Node
del(temp)
# Then move to next node and repeat
# the loop till list ends.
temp = prev.next
# Method to print the linked list
def printList(self):
ptr = self.head
while(ptr != None):
x = ptr.data
print(x, ' ', end = '')
ptr = ptr.next
print()
# Driver Code
if __name__=='__main__':
# Start with empty list
head = LinkedList()
# Create the linked list Adding
# a new node at End of the list
head.push(12)
head.push(15)
head.push(9)
head.push(11)
head.push(5)
head.push(6)
head.push(7)
print("Initial List: ", end = '')
head.printList()
K = 3
head.deleteDivisibleNodes(K)
print("Final List: ", end = '')
head.printList()
# This code is contributed by Amit Mangal
C#
// C# program to delete all the nodes
// from the list that are divisible
// by the specified value K
using System;
class GFG
{
// Tree Node
public class Node
{
public int data;
public Node next;
};
// Function to create a new node
static Node getNode(int data)
{
Node newNode = new Node();
newNode.data = data;
newNode.next = null;
return newNode;
}
// Function to delete all the nodes
// from the list that divisible by
// the specified value K
static Node deleteDivisibleNodes(Node head_ref,
int K)
{
Node temp = head_ref, prev = null;
// If head node itself holds
// the value divisible by K
while (temp != null &&
temp.data % K == 0)
{
head_ref = temp.next; // Changed head
//free(temp); // free old head
temp = head_ref; // Change temp
}
// Delete occurrences other than head
while (temp != null)
{
// Search for the node to be deleted,
// keep track of the previous node as we
// need to change 'prev.next'
while (temp != null &&
temp.data % K != 0)
{
prev = temp;
temp = temp.next;
}
// If required value node
// was not present in linked list
if (temp == null)
return head_ref;
// Unlink the node from linked list
prev.next = temp.next;
//delete temp; // Free memory
// Update Temp for next iteration of
// outer loop
temp = prev.next;
}
return null;
}
// function to a print a linked list
static void printList(Node head)
{
while (head != null)
{
Console.Write(head.data + " ");
head = head.next;
}
}
// Driver code
public static void Main(String[] args)
{
// Create list: 12->15->9->11->5->6->7
Node head = getNode(12);
head.next = getNode(15);
head.next.next = getNode(9);
head.next.next.next = getNode(11);
head.next.next.next.next = getNode(5);
head.next.next.next.next.next = getNode(6);
head.next.next.next.next.next.next = getNode(7);
int K = 3;
Console.Write("Initial List: ");
printList(head);
head = deleteDivisibleNodes(head, K);
Console.Write("\nFinal List: ");
printList(head);
}
}
// This code is contributed by PrinciRaj1992
Javascript
输出:
Initial List: 12 15 9 11 5 6 7
Final List: 11 5 7