📜  链表中的多数元素

📅  最后修改于: 2021-10-28 01:40:42             🧑  作者: Mango

给定一个链表,找到多数元素。如果一个元素出现多于或等于n/2次,则称为多数元素,其中 n 是链表中的节点总数。
例子:

Input  : 1->2->3->4->5->1->1->1->NULL
Output : 1
Explanation  1 occurs 4 times 
Input :10->23->11->9->54->NULL
Output :NO majority element

方法一(简单)
从头开始运行两个循环,并迭代地计算每个元素的频率。打印频率大于或等于 n/2 的元素。在这种方法中,时间复杂度为O(n*n) ,其中 n 是链表中的节点数。

C++
// C++ program to find majority element in
// a linked list
#include 
using namespace std;
 
/* Link list node */
struct Node {
    int data;
    struct Node* next;
};
 
/* Function to get the nth node from the
last of a linked list*/
int majority(struct Node* head)
{
    struct Node* p = head;
     
    int total_count = 0, max_count = 0, res = -1;
    while (p != NULL) {
 
        // Count all occurrences of p->data
        int count = 1;
        struct Node* q = p->next;
        while (q != NULL) {
            if (p->data == q->data)            
               count++;             
            q = q->next;
        }
 
        // Update max_count and res if count
        // is more than max_count
        if (count > max_count)
        {
            max_count = count;
            res = p->data;
        }
 
        p = p->next;
        total_count++;
    }
 
    if (max_count >= total_count/2)
        return res;
 
    // if we reach here it means no
    // majority element is present.
    // and we assume that all the
    // element are positive
    return -1;
}
 
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;
}
 
/* Driver program to test above function*/
int main()
{
    /* Start with the empty list */
    struct Node* head = NULL;
 
    // create linked
    push(&head, 1);
    push(&head, 1);
    push(&head, 1);
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);
 
    int res = majority(head);
 
    if (res != (-1))
        cout << "Majority element is " << res;
    else
        cout << "No majority element";
    return 0;
}


Java
// Java program to find majority element in
// a linked list
import java.util.*;
 
class GFG
{
static Node head;
 
/* Link list node */
static class Node
{
    int data;
    Node next;
};
 
/* Function to get the nth node from
the last of a linked list*/
static int majority(Node head)
{
    Node p = head;
     
    int total_count = 0,
        max_count = 0, res = -1;
    while (p != null)
    {
 
        // Count all occurrences of p->data
        int count = 1;
        Node q = p.next;
        while (q != null)
        {
            if (p.data == q.data)            
                count++;            
            q = q.next;
        }
 
        // Update max_count and res if count
        // is more than max_count
        if (count > max_count)
        {
            max_count = count;
            res = p.data;
        }
 
        p = p.next;
        total_count++;
    }
 
    if (max_count >= total_count / 2)
        return res;
 
    // if we reach here it means no
    // majority element is present.
    // and we assume that all the
    // element are positive
    return -1;
}
 
static void push(Node head_ref,    
                 int new_data)
{
    Node new_node = new Node();
    new_node.data = new_data;
    new_node.next = head_ref;
    head_ref = new_node;
    head = head_ref;
}
 
// Driver Code
public static void main(String[] args)
 
{
 
    /* Start with the empty list */
    head = null;
 
    // create linked
    push(head, 1);
    push(head, 1);
    push(head, 1);
    push(head, 5);
    push(head, 4);
    push(head, 3);
    push(head, 2);
    push(head, 1);
 
    int res = majority(head);
 
    if (res != (-1))
        System.out.println("Majority element is " + res);
    else
        System.out.println("No majority element");
    }
}
 
// This code is contributed by Princi Singh


Python3
# Python3 program to find majority element in
# a linked list
head = None
 
# Link list node
class Node :
    def __init__(self):
        self.data = 0
        self.next = None
 
# Function to get the nth node from
# the last of a linked list
def majority(head):
    p = head
     
    total_count = 0
    max_count = 0
    res = -1
    while (p != None):
     
        # Count all occurrences of p->data
        count = 1
        q = p.next
        while (q != None):
         
            if (p.data == q.data):            
                count = count + 1           
            q = q.next
         
        # Update max_count and res if count
        # is more than max_count
        if (count > max_count):
         
            max_count = count
            res = p.data
         
        p = p.next
        total_count = total_count + 1
     
    if (max_count >= total_count / 2):
        return res
 
    # if we reach here it means no
    # majority element is present.
    # and we assume that all the
    # element are positive
    return -1
 
def push( head_ref, new_data):
    global head
    new_node = Node()
    new_node.data = new_data
    new_node.next = head_ref
    head_ref = new_node
    head = head_ref
 
# Driver Code
 
# Start with the empty list
head = None
 
# create linked
push(head, 1)
push(head, 1)
push(head, 1)
push(head, 5)
push(head, 4)
push(head, 3)
push(head, 2)
push(head, 1)
 
res = majority(head)
 
if (res != (-1)):
    print("Majority element is " , res)
else:
    print("No majority element")
     
# This code is contributed by Arnab Kundu


C#
// C# program to find majority element in
// a linked list
using System;
     
class GFG
{
    static Node head;
     
    /* Link list node */
    public class Node
    {
        public int data;
        public Node next;
    };
     
    /* Function to get the nth node from
    the last of a linked list*/
    static int majority(Node head)
    {
        Node p = head;
         
        int total_count = 0,
            max_count = 0, res = -1;
        while (p != null)
        {
     
            // Count all occurrences of p->data
            int count = 1;
            Node q = p.next;
            while (q != null)
            {
                if (p.data == q.data)            
                    count++;            
                q = q.next;
            }
     
            // Update max_count and res if count
            // is more than max_count
            if (count > max_count)
            {
                max_count = count;
                res = p.data;
            }
     
            p = p.next;
            total_count++;
        }
     
        if (max_count >= total_count / 2)
            return res;
     
        // if we reach here it means no
        // majority element is present.
        // and we assume that all the
        // element are positive
        return -1;
    }
     
    static void push(Node head_ref,    
                     int new_data)
    {
        Node new_node = new Node();
        new_node.data = new_data;
        new_node.next = head_ref;
        head_ref = new_node;
        head = head_ref;
    }
 
// Driver Code
public static void Main(String[] args)
{
 
    /* Start with the empty list */
    head = null;
 
    // create linked
    push(head, 1);
    push(head, 1);
    push(head, 1);
    push(head, 5);
    push(head, 4);
    push(head, 3);
    push(head, 2);
    push(head, 1);
 
    int res = majority(head);
 
    if (res != (-1))
        Console.WriteLine("Majority element is " + res);
    else
        Console.WriteLine("No majority element");
    }
}
 
// This code is contributed by PrinciRaj1992


Javascript


C++
// CPP program to find majority element
// in the linked list using hashing
#include 
using namespace std;
 
/* Link list node */
struct Node {
    int data;
    struct Node* next;
};
 
/* Function to get the nth node from the last
 of a linked list*/
int majority(struct Node* head)
{
    struct Node* p = head;
 
    // Storing elements and their frequencies
    // in a hash table.
    unordered_map hash;
     
    int total_count = 0;
    while (p != NULL) {
 
        // increase every element
        // frequency by 1
        hash[p->data]++;
 
        p = p->next;
 
        total_count++;
    }
 
    // Check if frequency of any element
    // is more than or equal to total_count/2
    for (auto x : hash)
       if (x.second >= total_count/2)
           return x.first;
 
    // If we reach here means no majority element
    // is present. We assume that all the element
    // are positive
    return -1;
}
 
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;
}
 
// Driver program to test above function
int main()
{
 
    /* Start with the empty list */
    struct Node* head = NULL;
    push(&head, 1);
    push(&head, 1);
    push(&head, 1);
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);
 
    int res = majority(head);
 
    if (res != (-1))
        cout << "majority element is " << res;
    else
        cout << "NO majority element";
    return 0;
}


Java
// JAVA program to find majority element
// in the linked list using hashing
import java.util.*;
 
class GFG
{
 
/* Link list node */
static class Node
{
    int data;
    Node next;
};
 
/* Function to get the nth node from the last
of a linked list*/
static int majority(Node head)
{
    Node p = head;
 
    // Storing elements and their frequencies
    // in a hash table.
    HashMap hash = new HashMap();
     
    int total_count = 0;
    while (p != null)
    {
 
        // increase every element
        // frequency by 1
        if(hash.containsKey(p.data))
            hash.put(p.data, hash.get(p.data) + 1);
        else
            hash.put(p.data, 1);
 
        p = p.next;
 
        total_count++;
    }
 
    // Check if frequency of any element
    // is more than or equal to total_count/2
    for (Map.Entry x : hash.entrySet())
    if (x.getValue() >= total_count/2)
        return x.getKey();
 
    // If we reach here means no majority element
    // is present. We assume that all the element
    // are positive
    return -1;
}
 
static Node push(Node head_ref, int new_data)
{
    Node new_node = new Node();
    new_node.data = new_data;
    new_node.next = head_ref;
    head_ref = new_node;
    return head_ref;
}
 
// Driver code
public static void main(String[] args)
{
 
    /* Start with the empty list */
    Node head = null;
    head = push(head, 1);
    head = push(head, 1);
    head = push(head, 1);
    head = push(head, 5);
    head = push(head, 4);
    head = push(head, 3);
    head = push(head, 2);
    head = push(head, 1);
 
    int res = majority(head);
 
    if (res != (-1))
        System.out.print("majority element is " + res);
    else
        System.out.print("NO majority element");
}
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 program to find majority element
# in the linked list using hashing
  
''' Link list node '''
class Node:   
    def __init__(self, data):       
        self.data = data
        self.next = None
      
''' Function to get the nth node from the last
 of a linked list'''
def majority(head):
    p = head;
  
    # Storing elements and their frequencies
    # in a hash table.
    hash = dict()
      
    total_count = 0;
    while (p != None):
  
        # increase every element
        # frequency by 1
        if p.data not in hash:
            hash[p.data] = 0
     
        hash[p.data] += 1
        p = p.next;
        total_count += 1
  
    # Check if frequency of any element
    # is more than or equal to total_count/2
    for x in hash.keys():
       if (hash[x] >= total_count//2):
           return x;
  
    # If we reach here means no majority element
    # is present. We assume that all the element
    # are positive
    return -1;
  
def push(head_ref, new_data):
    new_node = Node(new_data)
    new_node.next = (head_ref);
    (head_ref) = new_node;
    return head_ref
  
# Driver code
if __name__=='__main__':
  
    ''' Start with the empty list '''
    head = None
    head = push(head, 1);
    head = push(head, 1);
    head = push(head, 1);
    head = push(head, 5);
    head = push(head, 4);
    head = push(head, 3);
    head = push(head, 2);
    head = push(head, 1);
    res = majority(head);
    if (res != (-1)):
        print("majority element is " + str(res))       
    else:
        print("NO majority element")
     
# This code is contributed by rutvik_56


C#
// C# program to find majority element
// in the linked list using hashing
using System;
using System.Collections.Generic;
class GFG
{
 
/* Link list node */
public class Node
{
    public int data;
    public Node next;
};
 
/* Function to get the nth node
from the last of a linked list*/
static int majority(Node head)
{
    Node p = head;
 
    // Storing elements and their frequencies
    // in a hash table.
    Dictionary hash = new Dictionary();
     
    int total_count = 0;
    while (p != null)
    {
 
        // increase every element
        // frequency by 1
        if(hash.ContainsKey(p.data))
            hash[p.data] = hash[p.data] + 1;
        else
            hash.Add(p.data, 1);
 
        p = p.next;
 
        total_count++;
    }
 
    // Check if frequency of any element
    // is more than or equal to total_count/2
    foreach(KeyValuePair x in hash)
    if (x.Value >= total_count/2)
        return x.Key;
 
    // If we reach here means no majority element
    // is present. We assume that all the element
    // are positive
    return -1;
}
 
static Node push(Node head_ref, int new_data)
{
    Node new_node = new Node();
    new_node.data = new_data;
    new_node.next = head_ref;
    head_ref = new_node;
    return head_ref;
}
 
// Driver code
public static void Main(String[] args)
{
 
    /* Start with the empty list */
    Node head = null;
    head = push(head, 1);
    head = push(head, 1);
    head = push(head, 1);
    head = push(head, 5);
    head = push(head, 4);
    head = push(head, 3);
    head = push(head, 2);
    head = push(head, 1);
 
    int res = majority(head);
 
    if (res != (-1))
        Console.Write("majority element is " + res);
    else
        Console.Write("NO majority element");
}
}
 
// This code is contributed by 29AjayKumar


Javascript


输出
Majority element is 1

时间复杂度 O(n*n)
方法 2使用散列技术。我们计算每个元素的频率,然后打印频率≥ n/2 的元素;

C++

// CPP program to find majority element
// in the linked list using hashing
#include 
using namespace std;
 
/* Link list node */
struct Node {
    int data;
    struct Node* next;
};
 
/* Function to get the nth node from the last
 of a linked list*/
int majority(struct Node* head)
{
    struct Node* p = head;
 
    // Storing elements and their frequencies
    // in a hash table.
    unordered_map hash;
     
    int total_count = 0;
    while (p != NULL) {
 
        // increase every element
        // frequency by 1
        hash[p->data]++;
 
        p = p->next;
 
        total_count++;
    }
 
    // Check if frequency of any element
    // is more than or equal to total_count/2
    for (auto x : hash)
       if (x.second >= total_count/2)
           return x.first;
 
    // If we reach here means no majority element
    // is present. We assume that all the element
    // are positive
    return -1;
}
 
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;
}
 
// Driver program to test above function
int main()
{
 
    /* Start with the empty list */
    struct Node* head = NULL;
    push(&head, 1);
    push(&head, 1);
    push(&head, 1);
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);
 
    int res = majority(head);
 
    if (res != (-1))
        cout << "majority element is " << res;
    else
        cout << "NO majority element";
    return 0;
}

Java

// JAVA program to find majority element
// in the linked list using hashing
import java.util.*;
 
class GFG
{
 
/* Link list node */
static class Node
{
    int data;
    Node next;
};
 
/* Function to get the nth node from the last
of a linked list*/
static int majority(Node head)
{
    Node p = head;
 
    // Storing elements and their frequencies
    // in a hash table.
    HashMap hash = new HashMap();
     
    int total_count = 0;
    while (p != null)
    {
 
        // increase every element
        // frequency by 1
        if(hash.containsKey(p.data))
            hash.put(p.data, hash.get(p.data) + 1);
        else
            hash.put(p.data, 1);
 
        p = p.next;
 
        total_count++;
    }
 
    // Check if frequency of any element
    // is more than or equal to total_count/2
    for (Map.Entry x : hash.entrySet())
    if (x.getValue() >= total_count/2)
        return x.getKey();
 
    // If we reach here means no majority element
    // is present. We assume that all the element
    // are positive
    return -1;
}
 
static Node push(Node head_ref, int new_data)
{
    Node new_node = new Node();
    new_node.data = new_data;
    new_node.next = head_ref;
    head_ref = new_node;
    return head_ref;
}
 
// Driver code
public static void main(String[] args)
{
 
    /* Start with the empty list */
    Node head = null;
    head = push(head, 1);
    head = push(head, 1);
    head = push(head, 1);
    head = push(head, 5);
    head = push(head, 4);
    head = push(head, 3);
    head = push(head, 2);
    head = push(head, 1);
 
    int res = majority(head);
 
    if (res != (-1))
        System.out.print("majority element is " + res);
    else
        System.out.print("NO majority element");
}
}
 
// This code is contributed by Rajput-Ji

蟒蛇3

# Python3 program to find majority element
# in the linked list using hashing
  
''' Link list node '''
class Node:   
    def __init__(self, data):       
        self.data = data
        self.next = None
      
''' Function to get the nth node from the last
 of a linked list'''
def majority(head):
    p = head;
  
    # Storing elements and their frequencies
    # in a hash table.
    hash = dict()
      
    total_count = 0;
    while (p != None):
  
        # increase every element
        # frequency by 1
        if p.data not in hash:
            hash[p.data] = 0
     
        hash[p.data] += 1
        p = p.next;
        total_count += 1
  
    # Check if frequency of any element
    # is more than or equal to total_count/2
    for x in hash.keys():
       if (hash[x] >= total_count//2):
           return x;
  
    # If we reach here means no majority element
    # is present. We assume that all the element
    # are positive
    return -1;
  
def push(head_ref, new_data):
    new_node = Node(new_data)
    new_node.next = (head_ref);
    (head_ref) = new_node;
    return head_ref
  
# Driver code
if __name__=='__main__':
  
    ''' Start with the empty list '''
    head = None
    head = push(head, 1);
    head = push(head, 1);
    head = push(head, 1);
    head = push(head, 5);
    head = push(head, 4);
    head = push(head, 3);
    head = push(head, 2);
    head = push(head, 1);
    res = majority(head);
    if (res != (-1)):
        print("majority element is " + str(res))       
    else:
        print("NO majority element")
     
# This code is contributed by rutvik_56

C#

// C# program to find majority element
// in the linked list using hashing
using System;
using System.Collections.Generic;
class GFG
{
 
/* Link list node */
public class Node
{
    public int data;
    public Node next;
};
 
/* Function to get the nth node
from the last of a linked list*/
static int majority(Node head)
{
    Node p = head;
 
    // Storing elements and their frequencies
    // in a hash table.
    Dictionary hash = new Dictionary();
     
    int total_count = 0;
    while (p != null)
    {
 
        // increase every element
        // frequency by 1
        if(hash.ContainsKey(p.data))
            hash[p.data] = hash[p.data] + 1;
        else
            hash.Add(p.data, 1);
 
        p = p.next;
 
        total_count++;
    }
 
    // Check if frequency of any element
    // is more than or equal to total_count/2
    foreach(KeyValuePair x in hash)
    if (x.Value >= total_count/2)
        return x.Key;
 
    // If we reach here means no majority element
    // is present. We assume that all the element
    // are positive
    return -1;
}
 
static Node push(Node head_ref, int new_data)
{
    Node new_node = new Node();
    new_node.data = new_data;
    new_node.next = head_ref;
    head_ref = new_node;
    return head_ref;
}
 
// Driver code
public static void Main(String[] args)
{
 
    /* Start with the empty list */
    Node head = null;
    head = push(head, 1);
    head = push(head, 1);
    head = push(head, 1);
    head = push(head, 5);
    head = push(head, 4);
    head = push(head, 3);
    head = push(head, 2);
    head = push(head, 1);
 
    int res = majority(head);
 
    if (res != (-1))
        Console.Write("majority element is " + res);
    else
        Console.Write("NO majority element");
}
}
 
// This code is contributed by 29AjayKumar

Javascript


时间复杂度 O(n)
输出 :

majority element is 1

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