刷题力扣面试题 02.01. 移除重复节点

题目链接

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目描述

编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

示例1:

 输入:[1, 2, 3, 3, 2, 1]
 输出:[1, 2, 3]

示例2:

 输入:[1, 1, 1, 1, 2]
 输出:[1, 2]

提示:

  • 链表长度在[0, 20000]范围内。
  • 链表元素在[0, 20000]范围内。

进阶:

  • 如果不得使用临时缓冲区,该怎么解决?

题目分析

  1. 根据题目描述,删除链表中重复的元素节点
  2. 使用哈希表记录出现过的节点元素
  3. 当元素没有出现过就插入哈希表,若出现过就从链表中删除

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeDuplicateNodes(ListNode* head) {
        if (!head || !head->next) {
            return head;
        }
        std::unordered_set<int> keySet;
        ListNode* p = head;
        ListNode* q = p->next;
        keySet.insert(p->val);
        while (p->next) {
            q = p->next;
            if (keySet.find(q->val) == keySet.end()) {
                keySet.insert(q->val);
                p = q;
            } else {
                p->next = q->next;
                delete q;
            }
        }
        return head;
    }
};
原文地址:https://www.cnblogs.com/HanYG/p/15808956.html