您的位置:首页 > 其它

[LeetCode]Remove Duplicates from Sorted List II

2013-05-31 10:39 435 查看
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
//three pointer, the previous valid pointer, the first pointer of these same elements, current pointer
//always think twice about these edge cases
public:
ListNode *deleteDuplicates(ListNode *head) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ListNode* preValid = NULL;
ListNode* preSame = NULL;
ListNode* cur = head;
while (cur)
{
if(!preSame) preSame = cur;
else if(cur->val != preSame->val && preSame->next == cur)//continuous different then preSame can be the preValid
{
if(!preValid)
{
head = preSame;
preValid = preSame;
}
else
{
preValid->next = preSame;
preValid = preSame;
}
preSame = cur;
}
else if (cur->val != preSame->val && preSame->next != cur)//not continuous different
preSame = cur;
cur = cur->next;
}
//4 special edge cases
if(!preValid && preSame && preSame->next != NULL) return NULL;
else if(!preValid && preSame && preSame->next == NULL) return preSame;
else if(preValid && preSame->next != NULL) preValid->next = NULL;
else if(preValid && preSame->next == NULL) preValid->next = preSame;

return head;
}
};

second time

/**
* 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) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ListNode dummy(-1);
ListNode* savePtr = &dummy;
ListNode* cur = head;
ListNode* prev = &dummy;
while(cur != NULL)
{
if((prev == &dummy || prev->val != cur->val)
&& (cur->next == NULL || cur->next->val != cur->val))
{
savePtr->next = cur;
savePtr = savePtr->next;
}
prev = cur;
cur = cur->next;
}
savePtr->next = NULL;
return dummy.next;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: