📜  计算给定链接列表中的重复项

📅  最后修改于: 2021-04-23 22:30:08             🧑  作者: Mango

给定一个链表。任务是计算链接列表中重复节点的数量。
例子:

简单方法:我们遍历整个链表。对于每个节点,我们在其余列表中检查是否存在重复节点。如果是这样,我们将增加计数。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
#include 
using namespace std;
  
// Representation of node
struct Node {
    int data;
    Node* next;
};
  
  
// Function to insert a node at the beginning
void insert(Node** head, int item)
{
    Node* temp = new Node();
    temp->data = item;
    temp->next = *head;
    *head = temp;
}
  
// Function to count the number of
// duplicate nodes in the linked list
int countNode(Node* head)
{
    int count = 0;
  
    while (head->next != NULL) {
  
        // Starting from the next node
        Node *ptr = head->next;
        while (ptr != NULL) {
  
            // If some duplicate node is found
            if (head->data == ptr->data) {
                count++;
                break;
            }
            ptr = ptr->next;
        }
  
        head = head->next;
    }
  
    // Return the count of duplicate nodes
    return count;
}
  
// Driver code
int main()
{
    Node* head = NULL;
    insert(&head, 5);
    insert(&head, 7);
    insert(&head, 5);
    insert(&head, 1);
    insert(&head, 7);
  
    cout << countNode(head);
  
    return 0;
}


Java
// Java implementation of the approach 
class GFG
{
      
// Representation of node 
static class Node 
{ 
    int data; 
    Node next; 
}; 
  
  
// Function to insert a node at the beginning 
static Node insert(Node head, int item) 
{ 
    Node temp = new Node(); 
    temp.data = item; 
    temp.next = head; 
    head = temp;
    return head;
} 
  
// Function to count the number of 
// duplicate nodes in the linked list 
static int countNode(Node head) 
{ 
    int count = 0; 
  
    while (head.next != null) 
    { 
  
        // Starting from the next node 
        Node ptr = head.next; 
        while (ptr != null) 
        { 
  
            // If some duplicate node is found 
            if (head.data == ptr.data) 
            { 
                count++; 
                break; 
            } 
            ptr = ptr.next; 
        } 
  
        head = head.next; 
    } 
  
    // Return the count of duplicate nodes 
    return count; 
} 
  
// Driver code 
public static void main(String args[])
{ 
    Node head = null; 
    head = insert(head, 5); 
    head = insert(head, 7); 
    head = insert(head, 5); 
    head = insert(head, 1); 
    head = insert(head, 7); 
  
    System.out.println( countNode(head)); 
}
} 
  
// This code is contributed by Arnab Kundu


Python3
# Python3 implementation of the approach
import math
  
# Representation of node
class Node: 
    def __init__(self, data): 
        self.data = data 
        self.next = None
  
# Function to push a node at the beginning
def push(head, item): 
    temp = Node(item); 
    temp.data = item; 
    temp.next = head; 
    head = temp;
    return head;
          
# Function to count the number of
# duplicate nodes in the linked list
def countNode(head):
    count = 0
    while (head.next != None):
          
        # print(1)
        # Starting from the next node
        ptr = head.next
        while (ptr != None):
              
            # print(2)
            # If some duplicate node is found
            if (head.data == ptr.data):
                count = count + 1
                break
            ptr = ptr.next
        head = head.next
          
    # Return the count of duplicate nodes
    return count
  
# Driver code
if __name__=='__main__': 
  
    head = None;
    head = push(head, 5)
    head = push(head, 7)
    head = push(head, 5)
    head = push(head, 1)
    head = push(head, 7)
    print(countNode(head))
  
# This code is contributed by Srathore


C#
// C# implementation of the approach 
using System;
      
class GFG
{
      
// Representation of node 
public class Node 
{ 
    public int data; 
    public Node next; 
}; 
  
  
// Function to insert a node at the beginning 
static Node insert(Node head, int item) 
{ 
    Node temp = new Node(); 
    temp.data = item; 
    temp.next = head; 
    head = temp;
    return head;
} 
  
// Function to count the number of 
// duplicate nodes in the linked list 
static int countNode(Node head) 
{ 
    int count = 0; 
  
    while (head.next != null) 
    { 
  
        // Starting from the next node 
        Node ptr = head.next; 
        while (ptr != null) 
        { 
  
            // If some duplicate node is found 
            if (head.data == ptr.data) 
            { 
                count++; 
                break; 
            } 
            ptr = ptr.next; 
        } 
  
        head = head.next; 
    } 
  
    // Return the count of duplicate nodes 
    return count; 
} 
  
// Driver code 
public static void Main(String []args)
{ 
    Node head = null; 
    head = insert(head, 5); 
    head = insert(head, 7); 
    head = insert(head, 5); 
    head = insert(head, 1); 
    head = insert(head, 7); 
  
    Console.WriteLine( countNode(head)); 
}
}
  
// This code is contributed by Rajput-Ji


C++
// C++ implementation of the approach
#include 
#include 
using namespace std;
  
// Representation of node
struct Node {
    int data;
    Node* next;
};
  
// Function to insert a node at the beginning
void insert(Node** head, int item)
{
    Node* temp = new Node();
    temp->data = item;
    temp->next = *head;
    *head = temp;
}
  
// Function to count the number of
// duplicate nodes in the linked list
int countNode(Node* head)
{
    if (head == NULL)
       return 0;;
  
    // Create a hash table insert head
    unordered_set s;
    s.insert(head->data);
  
    // Traverse through remaining nodes    
    int count = 0;
    for (Node *curr=head->next; curr != NULL; curr=curr->next) {
        if (s.find(curr->data) != s.end())
             count++; 
  
        s.insert(curr->data);
    }
  
    // Return the count of duplicate nodes
    return count;
}
  
// Driver code
int main()
{
    Node* head = NULL;
    insert(&head, 5);
    insert(&head, 7);
    insert(&head, 5);
    insert(&head, 1);
    insert(&head, 7);
  
    cout << countNode(head);
  
    return 0;
}


Java
// Java implementation of the approach
import java.util.HashSet;
  
class GFG 
{
  
// Representation of node
static class Node
{
    int data;
    Node next;
};
static Node head;
  
// Function to insert a node at the beginning
static void insert(Node ref_head, int item)
{
    Node temp = new Node();
    temp.data = item;
    temp.next = ref_head;
    head = temp;
      
}
  
// Function to count the number of
// duplicate nodes in the linked list
static int countNode(Node head)
{
    if (head == null)
    return 0;;
  
    // Create a hash table insert head
    HashSets = new HashSet<>();
    s.add(head.data);
  
    // Traverse through remaining nodes 
    int count = 0;
    for (Node curr=head.next; curr != null; curr=curr.next) 
    {
        if (s.contains(curr.data))
            count++; 
  
        s.add(curr.data);
    }
  
    // Return the count of duplicate nodes
    return count;
}
  
// Driver code
public static void main(String[] args) 
{
  
    insert(head, 5);
    insert(head, 7);
    insert(head, 5);
    insert(head, 1);
    insert(head, 7);
  
    System.out.println(countNode(head));
}
}
  
// This code is contributed by Princi Singh


Python
# Python3 implementation of the approach 
  
# Node of a linked list 
class Node: 
    def __init__(self, data = None, next = None): 
        self.next = next
        self.data = data 
  
head = None
  
# Function to insert a node at the beginning
def insert(ref_head, item):
    global head
    temp = Node()
    temp.data = item
    temp.next = ref_head
    head = temp
      
# Function to count the number of
# duplicate nodes in the linked list
def countNode(head):
  
    if (head == None):
        return 0
  
    # Create a hash table insert head
    s = set()
    s.add(head.data)
  
    # Traverse through remaining nodes 
    count = 0
    curr = head.next
    while ( curr != None ) :
        if (curr.data in s):
            count = count + 1
  
        s.add(curr.data)
        curr = curr.next
  
    # Return the count of duplicate nodes
    return count
  
# Driver code
insert(head, 5)
insert(head, 7)
insert(head, 5)
insert(head, 1)
insert(head, 7)
  
print(countNode(head))
  
# This code is contributed by Arnab Kundu


C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
      
class GFG 
{
  
// Representation of node
public class Node
{
    public int data;
    public Node next;
};
static Node head;
  
// Function to insert a node at the beginning
static void insert(Node ref_head, int item)
{
    Node temp = new Node();
    temp.data = item;
    temp.next = ref_head;
    head = temp;
      
}
  
// Function to count the number of
// duplicate nodes in the linked list
static int countNode(Node head)
{
    if (head == null)
    return 0;;
  
    // Create a hash table insert head
    HashSets = new HashSet();
    s.Add(head.data);
  
    // Traverse through remaining nodes 
    int count = 0;
    for (Node curr=head.next; curr != null; curr=curr.next) 
    {
        if (s.Contains(curr.data))
            count++; 
  
        s.Add(curr.data);
    }
  
    // Return the count of duplicate nodes
    return count;
}
  
// Driver code
public static void Main(String[] args) 
{
  
    insert(head, 5);
    insert(head, 7);
    insert(head, 5);
    insert(head, 1);
    insert(head, 7);
  
    Console.WriteLine(countNode(head));
}
}
  
// This code is contributed by 29AjayKumar


输出:
2

时间复杂度: O(n * n)

高效的方法:想法是使用哈希

C++

// C++ implementation of the approach
#include 
#include 
using namespace std;
  
// Representation of node
struct Node {
    int data;
    Node* next;
};
  
// Function to insert a node at the beginning
void insert(Node** head, int item)
{
    Node* temp = new Node();
    temp->data = item;
    temp->next = *head;
    *head = temp;
}
  
// Function to count the number of
// duplicate nodes in the linked list
int countNode(Node* head)
{
    if (head == NULL)
       return 0;;
  
    // Create a hash table insert head
    unordered_set s;
    s.insert(head->data);
  
    // Traverse through remaining nodes    
    int count = 0;
    for (Node *curr=head->next; curr != NULL; curr=curr->next) {
        if (s.find(curr->data) != s.end())
             count++; 
  
        s.insert(curr->data);
    }
  
    // Return the count of duplicate nodes
    return count;
}
  
// Driver code
int main()
{
    Node* head = NULL;
    insert(&head, 5);
    insert(&head, 7);
    insert(&head, 5);
    insert(&head, 1);
    insert(&head, 7);
  
    cout << countNode(head);
  
    return 0;
}

Java

// Java implementation of the approach
import java.util.HashSet;
  
class GFG 
{
  
// Representation of node
static class Node
{
    int data;
    Node next;
};
static Node head;
  
// Function to insert a node at the beginning
static void insert(Node ref_head, int item)
{
    Node temp = new Node();
    temp.data = item;
    temp.next = ref_head;
    head = temp;
      
}
  
// Function to count the number of
// duplicate nodes in the linked list
static int countNode(Node head)
{
    if (head == null)
    return 0;;
  
    // Create a hash table insert head
    HashSets = new HashSet<>();
    s.add(head.data);
  
    // Traverse through remaining nodes 
    int count = 0;
    for (Node curr=head.next; curr != null; curr=curr.next) 
    {
        if (s.contains(curr.data))
            count++; 
  
        s.add(curr.data);
    }
  
    // Return the count of duplicate nodes
    return count;
}
  
// Driver code
public static void main(String[] args) 
{
  
    insert(head, 5);
    insert(head, 7);
    insert(head, 5);
    insert(head, 1);
    insert(head, 7);
  
    System.out.println(countNode(head));
}
}
  
// This code is contributed by Princi Singh

Python

# Python3 implementation of the approach 
  
# Node of a linked list 
class Node: 
    def __init__(self, data = None, next = None): 
        self.next = next
        self.data = data 
  
head = None
  
# Function to insert a node at the beginning
def insert(ref_head, item):
    global head
    temp = Node()
    temp.data = item
    temp.next = ref_head
    head = temp
      
# Function to count the number of
# duplicate nodes in the linked list
def countNode(head):
  
    if (head == None):
        return 0
  
    # Create a hash table insert head
    s = set()
    s.add(head.data)
  
    # Traverse through remaining nodes 
    count = 0
    curr = head.next
    while ( curr != None ) :
        if (curr.data in s):
            count = count + 1
  
        s.add(curr.data)
        curr = curr.next
  
    # Return the count of duplicate nodes
    return count
  
# Driver code
insert(head, 5)
insert(head, 7)
insert(head, 5)
insert(head, 1)
insert(head, 7)
  
print(countNode(head))
  
# This code is contributed by Arnab Kundu

C#

// C# implementation of the approach
using System;
using System.Collections.Generic;
      
class GFG 
{
  
// Representation of node
public class Node
{
    public int data;
    public Node next;
};
static Node head;
  
// Function to insert a node at the beginning
static void insert(Node ref_head, int item)
{
    Node temp = new Node();
    temp.data = item;
    temp.next = ref_head;
    head = temp;
      
}
  
// Function to count the number of
// duplicate nodes in the linked list
static int countNode(Node head)
{
    if (head == null)
    return 0;;
  
    // Create a hash table insert head
    HashSets = new HashSet();
    s.Add(head.data);
  
    // Traverse through remaining nodes 
    int count = 0;
    for (Node curr=head.next; curr != null; curr=curr.next) 
    {
        if (s.Contains(curr.data))
            count++; 
  
        s.Add(curr.data);
    }
  
    // Return the count of duplicate nodes
    return count;
}
  
// Driver code
public static void Main(String[] args) 
{
  
    insert(head, 5);
    insert(head, 7);
    insert(head, 5);
    insert(head, 1);
    insert(head, 7);
  
    Console.WriteLine(countNode(head));
}
}
  
// This code is contributed by 29AjayKumar
输出:
2

时间复杂度: O(n)