Leetcode82. 删除排序链表中的重复元素II

本文介绍了一种从已排序链表中删除重复元素的方法,通过使用三个指针pPre、pNode和pLast来遍历链表并移除重复项。文章详细解释了算法流程,并提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:给定一个排序的链表,要求删除所有重复的元素

题目分析:使用三个指针pPre,pNode,pLast。pPre指向当前需要判断的元素,pNode指向当前元素的后一个元素,如果pPre与pNode的值相等,那么将pNode后移,直到它们不相等,然后将pPre指向出现不相等的第一个元素。pLast指向的是在当前位置之前,已删除重复元素的链表的末位元素,也就是说,pLast指向的是最后一个不重复的元素。

代码展示:

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head==NULL)
            return head;
        ListNode* pNode = head->next;
        ListNode* pPre = head;
        ListNode* pLast = NULL;
        if(pNode==NULL)
            return head;
        while(pNode!=NULL){
            if(pNode->val==pPre->val){
                if(pNode->next==NULL){
                    if(pLast==NULL)
                        return NULL;
                    pLast->next = NULL;
                    return head;
                }
                while(pNode->next->val==pPre->val){
                    pNode = pNode->next;
                    if(pNode->next==NULL){
                        if(pLast==NULL)
                            return NULL;
                        pLast->next = NULL;
                        return head;
                    }
                }
                if(pLast==NULL){
                    head = pNode->next;
                }
                else
                    pLast->next = pNode->next;
                pPre = pNode->next;
                pNode = pPre->next;
            }
            else{
                pLast = pPre;
                pPre = pPre->next;
                pNode = pNode->next;
            }
        }
        return head;
    }
};

对于链表的题目,代码写出来之后要特别注意边界测试,即测试一下特殊的用例。比如说本题,要测试[1],[1,1,1],[1,1,2,2],[1,2,2,2,3,3,4]等等。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值