83. Remove Duplicates from Sorted List
Given a sorted linked list, delete all duplicates such that each element appear only once.
Example 1:
Input: 1->1->2
Output: 1->2
Example 2:
Input: 1->1->2->3->3
Output: 1->2->3
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode NODE;
///
///
/// Approach 1: Straight-Forward Approach
NODE *deleteDuplicates(NODE *head){
if (NULL == head || NULL == head->next) return head;
NODE *pre = head;
NODE *cur = head->next;
while (cur) {
if (pre->val == cur->val) {
pre->next = cur->next;
free(cur);
} else {
pre = cur;
}
cur = pre->next;
}
return head;
}
///
///
/// Approach 2: recursion version
NODE *deleteDuplicates(NODE *head){
if (NULL == head || NULL == head->next) return head;
NODE *next = head->next;
if (head->val == next->val) {
while (next && head->val == next->val) {
//NODE *del = next;
next = next->next;
//free(del);
}
head->next = deleteDuplicates(next);
} else {
head->next = deleteDuplicates(head->next);
}
return head;
}
///
///
/// Approach 3: another recursion version
static void recur(NODE *pre, NODE *cur) {
if (NULL == cur) return;
if (pre->val == cur->val) {
pre->next = cur->next;
free(cur);
recur(pre, pre->next);
} else {
recur(pre->next, cur->next);
}
}
NODE *deleteDuplicates(NODE *head){
if (NULL == head || NULL == head->next) return head;
NODE dum;
dum.val = head->val + 1;
dum.next = head;
recur(&dum, head);
return dum.next;
}