Notes:
1. Check when the loop finished. The last element still need to be remove.
2. when remove the current one, do not forget to move the pointer back to the prev->next
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *deleteDuplicates(ListNode *head) { 12 if (!head || !head->next) return head; 13 ListNode *result = new ListNode(0); 14 result->next = head; 15 ListNode *prev = result; 16 bool flag = false; 17 while (head) { 18 if (head->next && head->val == head->next->val) { 19 flag = true; 20 head->next = head->next->next; 21 continue; 22 } 23 if (flag) { 24 prev->next = head->next; 25 head = prev->next; 26 flag = false; 27 } else { 28 prev = head; 29 head = head->next; 30 } 31 } 32 if (flag) prev->next = prev->next->next; 33 return result->next; 34 } 35 };