给定一个链表,找到它的第一个非重复整数元素。
例子:
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 现场工作专业课程和学生竞争性编程现场课程。