题目来源
题目描述
ps:注意,提交的时候,要求保留数据顺序
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* removeDuplicateNodes(ListNode* head) {
}
};
题目解析
不使用临时缓冲区
ListNode* removeDuplicateNodes(ListNode* head) {
if(head == nullptr){
return nullptr;
}
ListNode *first = head;
while (first != NULL){
ListNode *second = first;
while (second->next != nullptr){
if(second->next->val == first->val){
second->next = second->next->next;
}else{
second = second->next;
}
}
first = first->next;
}
return head;
}
set
使用set或者hash表,头插法
- 遍历链表,如果链表中的值出现过,直接进入下一个节点
- 如果当前节点值没有出现过,加入set、使用当前节点值创建一个节点,挂载到新链表上
ListNode* removeDuplicateNodes(ListNode* head) {
if(head == NULL){
return NULL;
}
unordered_set<int> set;
ListNode *dummy = new ListNode(-1), *move = dummy, *iter = head;
while (iter){
if(!set.count(iter->val)){
move->next = new ListNode(iter->val);
move = move->next;
set.insert(iter->val);
}
iter = iter->next;
}
return dummy->next;
};
class Solution {
public:
ListNode* removeDuplicateNodes(ListNode* head) {
if(head == nullptr || head->next == nullptr){
return head;
}
std::unordered_set<int> set;
set.insert(head->val);
ListNode *curr = head->next, *prev = head;
while (curr != nullptr){
if(set.count(curr->val)){
prev->next = curr->next;
}else{
prev = curr;
set.insert(curr->val);
}
curr = curr->next;
}
return head;
}
};