删除链表中重复的结点

题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

思路来自网上:https://blog.youkuaiyun.com/u010429424/article/details/77967245
设置 三个指针,pre,h,post。分两种情况考虑:
当 h->val != post->val 的时候,三个指针均向后移动;
当 h->val == post->val 的时候,不断向后移动post,直到 不等,
此时,pre不动,将其next设为post。h,post 和第一种情况类似,向后移动。
注意,如果pre扔处在头节点的前一位置,那么,要将头结点 设为 post。因为最后返回的是 头结点。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
            ListNode* pre = new ListNode(0);
            ListNode* h = pHead;
            ListNode* post = nullptr;
        pre->next = h;
        post= h->next;
        
       while(h!=nullptr && post!=nullptr)
       {
           
           if (h->val != post->val)
           {
               pre = h;
           }
           
           else 
           {
           while (post!=nullptr && h->val == post->val)
           {
               post = post->next;
           }
           
           if (pre->next == pHead)
           {
               pHead = post;
           }
           
            pre->next = post;
           }
           
           h = post;
           post =post->next;
       }
       return pHead;
        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值