牛客网剑指offer-删除链表中重复的结点

题目描述

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


/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    //用一个指针记录前一个节点,就可以了,然后一开始在头结点前面添加一个额外的指针
    //最后再删掉可以省掉一些特判
    ListNode* deleteDuplication(ListNode* pHead)
    {
        ListNode *pPreHead = new ListNode(0), *p = pHead, *pPre = pPreHead, *tp;
        pPreHead->next = pHead;
        while (p != nullptr && p->next != nullptr)
        {
            if (p->val == p->next->val)
            {
                int d = p->val;
                while (p != nullptr && p->val == d)
                {
                    tp = p;
                    pPre->next = p->next;
                    p = p->next;
                    delete tp;
                }
            }
            else
            {
                pPre = p;
                p = p->next;
            }
        }
        p = pPreHead->next;
        delete pPreHead;
        return p;
    }
};

猜你喜欢

转载自blog.csdn.net/yhn19951008/article/details/79433728