这个问题有很多种解法。最直观简单的就是建立映射用以统计每个结点的出现次数,最后根据结果重构链表。这里介绍一种空间复杂度为O(1)的方法。
具体代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* head) {
ListNode *tp = new ListNode(-1); //临时头结点,这样可以将头结点的删除操作与其他结点的统一
tp -> next = head;
ListNode *p = tp;
while (p -> next) {
ListNode *q = p -> next;
while (q && p -> next -> val == q -> val) q = q -> next; //检测到重复结点
//判断p的连接方式
if (p -> next && p -> next -> next == q) p = p -> next; //若没有重复结点则直接后移一位
else p -> next = q; //否则直接连接到q上过滤掉所有重复结点
}
return tp -> next;
}
};