本题可能会把头结点删掉,凡是可能会把头结点删掉的,我们一般来说都定义一个虚拟头结点来简化代码
ListNode* dummy = new ListNode(-1);
dummy->next = head;
我们使用两个指针,第一个指针p存的是上一个保留段的结尾,q存的是下一段的第一个节点,q指针的作用是扫描下一段,把下一段全部扫描结束,如果下一段的长度为1,p指针向后移动一位,否则,p->next = q,直接跳过下一段。
/**
* 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* dummy = new ListNode(-1);
dummy->next = head;
ListNode* p = dummy;
while (p->next)
{
ListNode* q = p->next;
// q指针扫描下一段,只要q->val与段首的val相同,就一直后移
while (q && p->next->val == q->val) q = q->next;
// 如果下一段长度为1,p指针向后移动一位
if (p->next->next == q) p = p->next;
else p->next = q;
}
return dummy->next;
}
};