先看较为简单的83题,这个题可以保留一个,所以我们每次指向新元素,然后往后看有没有重复的,有重复的就一直往后即可。 保证每次处理一个独立的元素。
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head)return head;
ListNode *curr = head;
while(curr)
{
ListNode *tmp = curr;
while(curr->next && curr->next->val == curr->val)curr = curr->next;
tmp->next = curr->next;
curr = curr->next;
}
return head;
}
};
82题稍微加了点难度,即如果重复就删除数组里的该元素。首先,我们要延续上一题的做法,即一次循环把一个数处理好,这样能省很多事情。其次,我们需要存一个last节点,代表之前的元素,所以需要dummy节点。
在下面的代码中,处理顺序很重要,先处理正常的情况,剩下的一定是不正常的情况,对于不正常的情况,我们做简单的,和第一题类似的指针变化即可。
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head)return head;
ListNode *dummy = new ListNode();
dummy->next = head;
ListNode *curr = head, *last = dummy;
while(curr)
{
if(!curr->next || curr->next && curr->next->val != curr->val)
{
last = curr;
curr = curr->next;
continue;
}
while(curr->next && curr->next->val == curr->val)curr = curr->next;
last->next = curr->next;
curr = curr->next;
}
return dummy->next;
}
};
|