开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1:
输入: head = [1,2,3,3,4,4,5]
输出: [1,2,5]
示例 2:
输入: head = [1,1,1,2,3]
输出: [2,3]
提示:
- 链表中节点数目在范围
[0, 300]内 -100 <= Node.val <= 100- 题目数据保证链表已经按升序 排列
二、思路分析
这是一道中等难度的题目,也是第一道我自己完全独立做出来的题目!
由于涉及到删除的操作,在链表中不得不考虑头节点的特殊情况,即如果我们要删除的元素包括了头节点该怎么办。所以需要在前面加一个哨兵节点,这样就能妥善的解决这个特殊情况。
在调试中,还有比较特殊的是,假如最后的是重复节点需要删除该怎么办?所以在while循环结束后我又进行了分类讨论,解决这种特殊情况,最后终于成功通过。
但有瑕疵的是,这些被删除的节点,仍旧储存在系统中,并没有得到释放,只是不存在于链表中了。
三、AC代码
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* p=new ListNode();
ListNode* q=new ListNode();
ListNode* dummy=new ListNode(0,head);
p=head;
q=dummy;
while(p!=NULL&&p->next!=NULL){
if(p->val==p->next->val){
p=p->next;
continue;
}
else if(q->next==p){
q=p;
p=p->next;
}
else{
q->next=p->next;
p=p->next;
continue;
}
}
if(q->next==p){
return dummy->next;
}
else if(q->next!=p&&p->next==NULL){
q->next=NULL;
return dummy->next;
}
return dummy->next;
}
};
提交排名
四、总结
在遇到一些bug时,我们可以在软件上调试,也可以在纸上画图,看哪种方法更快。