话不多说,直接上代码,附注释
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == NULL || head->next == NULL)
return head;
ListNode node = ListNode(-101);//节点有效值-100~100,故为了不干扰实际链表中值的判断,添加值为-101的傀儡节点
ListNode* p0 = &node;
p0->next = head;//标记返回的链表表头
ListNode* p1 = p0; //用来间接删除重复元素
ListNode* p2 = head; //用来判断前后元素是否相等
ListNode* p3 = NULL; //用来判断前后元素是否相等
int temp; //用来取得重复节点元素的值,作为比较以向后判断更多的节点值
while(p2)
{
p3 = p2->next; //这一行放在这里或者下面均可(注意判p2是否空)
if(p3 == NULL)
{
break;
}
if(p2->val == p3->val)//发现重复
{
temp = p2->val;
while(p3->next && p3->next->val == temp)//检查是否有更多的重复
{
p3 = p3->next;
}
p1->next = p3->next; //“删除”重复的
p2 = p3->next; //更新至新的待检查区间
}
else
{
//更新至新的待检查区间
p1 = p2;
p2 = p3;
}
}
return p0->next;
}
};
- 我这个思路感觉全是通过例子一点点顺出来的,思路就比较通畅吧,也没有用到额外的啥结构。
- 题中的升序这一条件其实是想告诉我们如果有重复的元素出现,那么这些重复的元素一定是连续出现,中间不会间隔其他元素(其实是写题解的时候才幡然醒悟的,嘿嘿)。
- 可能大家思路的困难集中在“如何删除连续相同的三个及以上重复的元素”的部分,这里我是将重复值取出来,然后接着遍历去比较的。
如果还有其他思路希望可以分享给我呀。那小伙伴们加油哦,88~