📌  相关文章
📜  删除链表中所有出现的给定键

📅  最后修改于: 2022-05-13 01:57:43.984000             🧑  作者: Mango

删除链表中所有出现的给定键

给定一个单向链表,删除其中所有出现的给定键。例如,请考虑以下列表。

例子:

Input: 2 -> 2 -> 1 -> 8 -> 2 ->  3 -> 2 -> 7
       Key to delete = 2
Output:  1 -> 8 -> 3 -> 7 

这主要是这篇文章的扩展,它删除了给定键的第一次出现。
我们需要首先检查头节点上的所有事件并适当地更改头节点。然后我们需要检查循环中的所有事件并一一删除它们。

下面是上述想法的实现:

C++
// C++ program to delete all occurrences
// of a given key in linked list
#include 
using namespace std;
 
// A linked list node
class Node
{
    public:
        int data;
        Node* next;
};
 
// Given a reference (pointer) to the head
// of a list and an int, inserts a new node
// on the front of the list
Node* push(Node* head, int new_data)
{
    Node* new_node = new Node();
    new_node->data = new_data;
    new_node->next = head;
    head = new_node;
    return head;
}
 
// Given a reference (pointer)to the head
// of a list and a key, deletes all
// occurrence of the given key in
// linked list
Node* deleteKey(Node *head,int x)
{
     
    // Store head node
    Node *tmp = head;
     
    while (head->data == x)
    {
        head = head->next;
    }
    while (tmp->next != NULL)
    {
        if (tmp->next->data == x)
        {
            tmp->next = tmp->next->next;
        }
        else
        {
            tmp = tmp->next;
        }
    }
    return head;
}
 
// This function prints contents of
// linked list starting from the
// given node
void printList(Node* node)
{
    while (node->next != NULL)
    {
        cout << node->data << " ";
        node = node->next;
    }
    cout << node->data;
}
  
// Driver code
int main()
{
     
    // Start with the empty list
    Node* head = NULL;
    head = push(head, 7);
    head = push(head, 2);
    head = push(head, 3);
    head = push(head, 2);
    head = push(head, 8);
    head = push(head, 1);
    head = push(head, 2);
    head = push(head, 2);
     
    // Key to delete
    int key = 2 ;
  
    cout << "Created Linked List:\n ";
    printList(head);
  
    // Function call
    head = deleteKey(head, key);
    cout << "\nLinked List after Deletion is:\n";
     
    printList(head);
     
    return 0;
}
 
// This code is contributed by shivamsharma2020


C
// C Program to delete all occurrences of a given key in
// linked list
#include 
#include 
 
// A linked list node
struct Node
{
    int data;
    struct Node* next;
};
 
/* Given a reference (pointer to pointer) to the head of a
   list and an int, inserts a new node on the front of the
   list. */
void push(struct Node** head_ref, int new_data)
{
    struct Node* new_node
        = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}
 
/* Given a reference (pointer to pointer) to the head of a
   list and a key, deletes all occurrence of the given key
   in linked list */
void deleteKey(struct Node** head_ref, int key)
{
    // Store head node
    struct Node *temp = *head_ref, *prev;
 
    // If head node itself holds the key or multiple
    // occurrences of key
    while (temp != NULL && temp->data == key)
    {
        *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 key to be deleted, keep track of
        // the previous node as we need to change
        // 'prev->next'
        while (temp != NULL && temp->data != key)
        {
            prev = temp;
            temp = temp->next;
        }
 
        // If key was not present in linked list
        if (temp == NULL)
            return;
 
        // Unlink the node from linked list
        prev->next = temp->next;
 
        free(temp); // Free memory
 
        // Update Temp for next iteration of outer loop
        temp = prev->next;
    }
}
 
// This function prints contents of linked list starting
// from the given node
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;
 
    push(&head, 7);
    push(&head, 2);
    push(&head, 3);
    push(&head, 2);
    push(&head, 8);
    push(&head, 1);
    push(&head, 2);
    push(&head, 2);
 
    int key = 2; // key to delete
 
    puts("Created Linked List: ");
    printList(head);
 
    // Function call
    deleteKey(&head, key);
    puts("\nLinked List after Deletion is:");
 
    printList(head);
    return 0;
}


Java
// Java Program to delete all occurrences
// of a given key in linked list
class LinkedList
{
    static Node head; // head of list
 
    /* Linked list Node*/
    class Node
    {
        int data;
        Node next;
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
 
    /* Given a key, deletes all occurrence
    of the given key in linked list */
    void deleteKey(int key)
    {
        // Store head node
        Node temp = head, prev = null;
 
        // If head node itself holds the key
        // or multiple occurrences of key
        while (temp != null && temp.data == key)
        {
            head = temp.next; // Changed head
            temp = head; // Change Temp
        }
 
        // Delete occurrences other than head
        while (temp != null)
        {
            // Search for the key to be deleted,
            // keep track of the previous node
            // as we need to change 'prev->next'
            while (temp != null && temp.data != key)
            {
                prev = temp;
                temp = temp.next;
            }
 
            // If key was not present in linked list
            if (temp == null)
                return;
 
            // Unlink the node from linked list
            prev.next = temp.next;
 
            // Update Temp for next iteration of outer loop
            temp = prev.next;
        }
    }
 
    /* Inserts a new Node at front of the list. */
    public void push(int new_data)
    {
        Node new_node = new Node(new_data);
        new_node.next = head;
        head = new_node;
    }
 
    /* This function prints contents of linked list
    starting from the given node */
    public void printList()
    {
        Node tnode = head;
        while (tnode != null)
        {
            System.out.print(tnode.data + " ");
            tnode = tnode.next;
        }
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        LinkedList llist = new LinkedList();
 
        llist.push(7);
        llist.push(2);
        llist.push(3);
        llist.push(2);
        llist.push(8);
        llist.push(1);
        llist.push(2);
        llist.push(2);
 
        int key = 2; // key to delete
 
        System.out.println("Created Linked list is:");
        llist.printList();
 
        // Function call
        llist.deleteKey(key);
 
        System.out.println(
            "\nLinked List after Deletion is:");
        llist.printList();
    }
}
 
// This code is contributed by Shubham


Python3
# Python3 program to delete all occurrences
# of a given key in linked list
 
# Link list node
 
 
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
 
# Given a reference (pointer to pointer)
# to the head of a list and an int,
# inserts a new node on the front of the list.
 
 
def push(head_ref, new_data):
    new_node = Node(0)
    new_node.data = new_data
    new_node.next = (head_ref)
    (head_ref) = new_node
    return head_ref
 
# Given a reference (pointer to pointer)
# to the head of a list and a key,
# deletes all occurrence of the given key
# in linked list
 
 
def deleteKey(head_ref, key):
 
    # Store head node
    temp = head_ref
    prev = None
 
    # If head node itself holds the key
    # or multiple occurrences of key
    while (temp != None and temp.data == key):
        head_ref = temp.next  # Changed head
        temp = head_ref         # Change Temp
 
    # Delete occurrences other than head
    while (temp != None):
 
        # Search for the key to be deleted,
        # keep track of the previous node
        # as we need to change 'prev.next'
        while (temp != None and temp.data != key):
            prev = temp
            temp = temp.next
 
        # If key was not present in linked list
        if (temp == None):
            return head_ref
 
        # Unlink the node from linked list
        prev.next = temp.next
 
        # Update Temp for next iteration of outer loop
        temp = prev.next
    return head_ref
 
# This function prints contents of linked list
# starting from the given node
 
 
def printList(node):
    while (node != None):
        print(node.data, end=" ")
        node = node.next
 
 
# Driver Code
if __name__ == '__main__':
 
    # Start with the empty list
    head = None
 
    head = push(head, 7)
    head = push(head, 2)
    head = push(head, 3)
    head = push(head, 2)
    head = push(head, 8)
    head = push(head, 1)
    head = push(head, 2)
    head = push(head, 2)
 
    key = 2  # key to delete
 
    print("Created Linked List: ")
    printList(head)
 
    # Function call
    head = deleteKey(head, key)
    print("\nLinked List after Deletion is: ")
 
    printList(head)
 
# This code is contributed by Arnab Kundu


C#
// C# Program to delete all occurrences
// of a given key in linked list
using System;
 
class GFG
{
    static Node head; // head of list
 
    /* Linked list Node*/
    public class Node
    {
        public int data;
        public Node next;
        public Node(int d)
        {
            data = d;
            next = null;
        }
    }
 
    /* Given a key, deletes all occurrence
    of the given key in linked list */
    void deleteKey(int key)
    {
        // Store head node
        Node temp = head, prev = null;
 
        // If head node itself holds the key
        // or multiple occurrences of key
        while (temp != null && temp.data == key)
        {
            head = temp.next; // Changed head
            temp = head; // Change Temp
        }
 
        // Delete occurrences other than head
        while (temp != null)
        {
            // Search for the key to be deleted,
            // keep track of the previous node
            // as we need to change 'prev->next'
            while (temp != null && temp.data != key)
            {
                prev = temp;
                temp = temp.next;
            }
 
            // If key was not present in linked list
            if (temp == null)
                return;
 
            // Unlink the node from linked list
            prev.next = temp.next;
 
            // Update Temp for next iteration of outer loop
            temp = prev.next;
        }
    }
 
    /* Inserts a new Node at front of the list. */
    public void Push(int new_data)
    {
        Node new_node = new Node(new_data);
        new_node.next = head;
        head = new_node;
    }
 
    /* This function prints contents of linked list
    starting from the given node */
    public void printList()
    {
        Node tnode = head;
        while (tnode != null)
        {
            Console.Write(tnode.data + " ");
            tnode = tnode.next;
        }
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        GFG llist = new GFG();
 
        llist.Push(7);
        llist.Push(2);
        llist.Push(3);
        llist.Push(2);
        llist.Push(8);
        llist.Push(1);
        llist.Push(2);
        llist.Push(2);
 
        int key = 2; // key to delete
 
        Console.WriteLine("Created Linked list is:");
        llist.printList();
 
        // Function call
        llist.deleteKey(key);
 
        Console.WriteLine(
            "\nLinked List after Deletion is:");
        llist.printList();
    }
}
 
// This code is contributed by 29AjayKumar


Javascript


输出

Created Linked List: 
 2  2  1  8  2  3  2  7 
Linked List after Deletion is:
 1  8  3  7 

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程