题面
题解
- 对于可能删除头节点的链表,我们一般先定义一个虚拟的头节点来处理边界问题
- 然后从前往后扫描整个链表,每次扫描元素相同的一段,如果这段中的元素个数多于1个,则将整段元素直接删除。 O(n)
代码
/**
* 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) {
//定义一个虚拟节点
auto dummy = new ListNode(-1);
dummy->next = head;
auto p = dummy; //上一次保留的节点的最后一个位置
while (p->next) {
auto q = p->next; //下一段的第一个节点
while (q && p->next->val == q->val) q = q->next;
//如果这一段的长度大于1 ,那么就要全部删除
if (p->next->next == q) p = p->next;
else p->next = q;
}
return dummy->next;
}
};