原题链接Remove Duplicates from Sorted List II
分析:这道题说难不难,说简单也不简单,关键是思维要清晰。删除所有有重复元素,考虑到以下几个问题:从第一个节点开始就重复,中间位置重复,没有重复。
题解如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
/*
Time Complexity:O(N)
Space Complexity:O(1)
*/
if(!head || !head->next)return head;
ListNode* res=new ListNode(0);
res->next=head;
head=res;
/*
这里的逻辑:head指向的是已经确定不重复的节点最后一个,初始为新建的头结点。如果head之后的两个元素值相等,则进行去重复处理,如果不相等head后移一
位。去重复处理,也就是保存第一个重复的值,删除所有与该值相等的节点。最后返回的是头结点的next。
*/
while(head->next && head->next->next){
if(head->next->val==head->next->next->val){
int temp=head->next->val;
while(head->next&&head->next->val==temp){
head->next=head->next->next;
}
}
else head=head->next;
}
return res->next;
}
};