/** * struct ListNode { * int val; * struct ListNode *next; * }; */ class Solution { public: /** * * @param head ListNode类 * @return ListNode类 */ ListNode* deleteDuplicates(ListNode* head) { // write code here if( nullptr==head || nullptr==(head->next) ) { return head; } //改进的“双指针” ListNode * ret=new ListNode(-1); ListNode * pre=ret; ret->next=head; ListNode * Low=head; ListNode * Fast=head; while( nullptr!=Fast ) { Fast=Fast->next; if( nullptr==Fast ) { break; } int tag=0; while( nullptr!=Fast && Low->val!=Fast->val ) { pre=pre->next; Low=Low->next; Fast=Fast->next; } while( nullptr!=Fast && Low->val == Fast->val ) { Fast=Fast->next; tag=1; } if( tag ) { pre->next=Fast; ListNode * temp=Low; Low=Fast; while( temp!=Fast ) { ListNode * del=temp; temp=temp->next; delete del; } } if( nullptr==Fast ) { break; } } ListNode * temp=ret; ret=ret->next; delete temp; return ret; } };