剑指offer|删除链表中重复的结点

来源:互联网 发布:天猫淘宝店费用预算 编辑:程序博客网 时间:2024/05/29 15:05

题目描述

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

思路:

从前往后遍历,用一个指针pNode指向当前节点,一个指针pPre指向pNode的前一节点,一个指针pNext指向pNode的下一个节点。

如果pNext不为空,且其指向节点的值等于pNode指向节点的值,那么需要删除重复节点。删除完该重复节点之后要判断pPre是否为空指针,如果为空说明从头结点到pNode都被删除了,所以将头结点指向pNext。如果pPre不为空,则将其指向它的下一个节点。

如果不需要删除重复节点,则之间将pPre和pNode都向后移一个节点。

class Solution {public:    ListNode* deleteDuplication(ListNode* pHead)    {        if(pHead == nullptr)            return pHead;        ListNode* pNode=pHead;        ListNode* pPre=nullptr;        while(pNode)        {            ListNode* pNext=pNode->next;            if(pNext != nullptr && pNext->val == pNode->val)            {                ListNode* pToBeDeleted=pNode;                int value=pNode->val;                while(pToBeDeleted != nullptr && pToBeDeleted->val == value)                {                    pNext=pToBeDeleted->next;                    delete pToBeDeleted;                    pToBeDeleted=nullptr;                    pToBeDeleted=pNext;                }                if(pPre == nullptr)                    pHead=pNext;                else                    pPre->next=pNext;                pNode=pNext;            }            else            {                pPre=pNode;                pNode=pNode->next;            }        }        return pHead;    }};
0 0
原创粉丝点击