实现思路

利用一个unordered_map来存储链表中每个结点值出现的次数。然后遍历一遍链表。遇见结点值超过两次的直接跳过即可。
使用一个指针指向没有重复链表的结尾,然后用另一个指针去寻找值没有重复的那个结点,然后拼接在没有重复链表的结尾即可。

代码实现

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        if(!pHead) return nullptr;
    	unordered_map<int,int> m;
    	ListNode *dummy = new ListNode(-1);
    	ListNode *p = pHead;
    	//遍历链表,把结点值存储到unordered_map中
    	while(p)
    	{
    		m[p->val]++;
    		p = p->next;
    	}

    	dummy->next = pHead;
    	ListNode *pre = dummy;
    	ListNode *cur = pHead;
    	while(cur)
    	{	
          	//如果该结点不重复,把这个结点拼接在没有重复链表的结尾,让两个指针继续走
    		if(m[cur->val]==1)
    		{
    			pre->next = cur;
    			cur = cur->next;
    			pre = pre->next;
    		}
    		else //否则就去找值没有重复的那个结点
    		{
    			cur = cur->next;
    		}
    	}
    	//防止 1 2 2 3 4 4这种情况 输出1 3 4 4.
    	//正常情况下pre->next是cur。如果不是,则说明末尾的结点都是重复的
    	if(pre->next!=cur) pre->next=nullptr;
    	//如果都是重复的结点,比如2 2 3 3 4 4,那么pre指针根本不会移动
    	if(pre==dummy) return {};
    	else return dummy->next;
    }
};