剑指offer-面试题57:删除链表中重复的结点

来源:互联网 发布:直播狗网络电视官网 编辑:程序博客网 时间:2024/05/16 07:50

题目:在一个排序的链表中,如何删除重复的结点?例如1->2->3->3->4->4->5删除重复结点后为1->2->5。

思路:题目看似很简单,但要写出无bug鲁棒性好的代码其实有一定难度。首先重复结点可能出现在头结点,如果要修改头结点的指针,那么传入的参数应该为指针的指针,即指向头结点指针的指针。对于重复结点,处理的过程是先找到后面的第一个不等于当前结点的结点,然后将当前结点的前一个结点指向这个结点,中间部分的结点删除。同时当前结点后移,如果当前结点为头结点,那么要做的就只有更改头结点的指针。

void deleteDuplication(ListNode** pHead){    if(pHead == NULL || *pHead == NULL)        return;            ListNode* pPreNode = NULL;    ListNode* pNode = *pHead;    while(pNode != NULL)    {        ListNode* pNext = pNode->m_pNext;        bool needDelete = false;        if(pNext != NULL && pNext->m_nValue == pNode->m_nValue)            needDelete = true;                    if(!needDelete)        {            pPreNode = pNode;            pNode = pNode->m_pNext;        }        else        {            int value = pNode->m_nValue;            ListNode* pToBeDel = pNode;            while(pToBeDel != NULL && pToBeDel->m_nValue == value)            {                pNext = pToBeDel->m_pNext;                delete pToBeDel;                pToBeDel = NULL;                pToBeDel = pNext;            }                        if(pPreNode == NULL)                *pHead = pNext;            else                pPreNode->m_pNext = pNext;                        pNode = pNext;        }    }}



0 0
原创粉丝点击