leetcode 82 .删除链表中的重复元素 ||

题目描述
话不多说,直接上代码,附注释

/**
 * 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~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值