① 粗暴的双重循环
这是最开始通过的算法,用的是粗暴的双重循环,原因是没注意是有序链表;
对于外循环的每一个节点 内循环从它的下一个开始,判断是不是重复的,注意重复和不重复的指针移动情况是不一样的;
注意用“指针判空”控制边界条件的时候,慎用 p->next!=NULL 这样的条件,在自己电脑上没问题,提交leetcode就说我通过空指针访问;
代码:
class Solution {
public:
static ListNode* deleteDuplicates(ListNode* head) {
if (head == NULL) return head;
if (head->next == NULL) return head;
ListNode *p, *pre=head, *r,*q;
for (pre;pre!=NULL ; pre = pre->next)
{
for (p = pre, q = pre->next; q != NULL; )
{
if (q->val == pre->val)
{
p->next = q->next;
r = q;
q = q->next;
delete r;
}
else {
p = p->next;
q = q->next;
}
}
}
return head;
}
};
② 基于有序链表的算法;
很简单,直接上代码;
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head == NULL) return head;
if (head->next == NULL) return head;
ListNode *p=head->next, *pre=head;
while (p != NULL && pre != NULL)
{
if (p->val == pre->val)
{
pre->next = p->next;
delete p;
p = pre->next;
}
else { p = p->next; pre = pre->next; }
}
return head;
}
};