📜  链表中的第一个不重复

📅  最后修改于: 2021-10-27 08:32:15             🧑  作者: Mango

给定一个链表,找到它的第一个非重复整数元素。

例子:

Input : 10->20->30->10->20->40->30->NULL
Output :First Non-repeating element is 40.

Input :1->1->2->2->3->4->3->4->5->NULL
Output :First Non-repeating element is 5.

Input :1->1->2->2->3->4->3->4->NULL
Output :No NOn-repeating element is found.

1)创建一个哈希表并将所有元素标记为零。
2)遍历链表,统计hashtable中所有元素出现的频率。
3)再次遍历链表,查看hashtable中出现频率为1的元素。

C++
// C++ program to find first non-repeating
// element in a linked list
#include
using namespace std;
 
/* Link list node */
struct Node
{
    int data;
    struct Node* next;
};
 
/* Function to find the first non-repeating
 element in  the linked list */
int firstNonRepeating(struct Node *head)
{
    // Create an empty map and insert all linked
    // list elements into hash table
    unordered_map mp;
    for (Node *temp=head; temp!=NULL; temp=temp->next)
       mp[temp->data]++;   
    
    // Traverse the linked list again and return
    // the first node whose count is 1
    for (Node *temp=head; temp!=NULL; temp=temp->next)
       if (mp[temp->data] == 1)
           return temp->data;
 
    return -1;
}
 
/* Function to push a node */
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()
{
     // Let us create below linked list.
     // 85->15->18->20->85->35->4->20->NULL
     struct Node* head = NULL;
     push(&head, 20);
     push(&head, 4);
     push(&head, 35);
     push(&head, 85); 
     push(&head, 20);
     push(&head, 18);
     push(&head, 15);
     push(&head, 85);    
     cout << firstNonRepeating(head);                         
     return 0;
}


Python3
# Python3 program to find first non-repeating
# element in a linked list
 
# Link list node
class Node:
     
    def __init__(self, data):
        self.data = data
        self.next = None
         
# Function to find the first non-repeating
# element in  the linked list
def firstNonRepeating(head):
     
    # Create an empty map and insert all linked
    # list elements into hash table
    mp = dict()
    temp = head
     
    while (temp != None):
        if temp.data not in mp:
            mp[temp.data] = 0
             
        mp[temp.data] += 1
        temp = temp.next
     
    temp = head
     
    # Traverse the linked list again and return
    # the first node whose count is 1
    while (temp != None):
        if temp.data in mp:
            if mp[temp.data] == 1:
                return temp.data
                 
        temp = temp.next
  
    return -1
 
# Function to push a node
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__':
     
    # Let us create below linked list.
    # 85->15->18->20->85->35->4->20->NULL
    head = None
    head = push(head, 20)
    head = push(head, 4)
    head = push(head, 35)
    head = push(head, 85) 
    head = push(head, 20)
    head = push(head, 18)
    head = push(head, 15)
    head = push(head, 85)
     
    print(firstNonRepeating(head))
      
# This code is contributed by rutvik_56


Javascript


输出:

15

进一步优化:
上述解决方案需要对链表进行两次遍历。如果我们有很多重复元素,我们可以通过在哈希表中存储位置来节省一次遍历。请参阅 Given a 字符串 的最后一个方法,找到它的第一个非重复字符以获取详细信息。

?list=PLqM7alHXFySH41ZxzrPNj2pAYPOI8ITe7

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