【剑指Offer】面试题57:删除链表中重复的结点

来源:互联网 发布:网络ip冲突怎么办 编辑:程序博客网 时间:2024/05/16 14:33

一:题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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)    {        //边界条件:空或者只包括一个结点,直接返回if(pHead==NULL || (pHead!=NULL && pHead->next==NULL))            return pHead;                        ListNode* pPreNode=NULL; //发生重复结点的前一个结点        ListNode* pNode=pHead;                  while(pNode!=NULL){            ListNode* pNext=pNode->next;                        bool needDelete=false;  //是否发生重复            if(pNext!=NULL && pNext->val==pNode->val)                needDelete=true;                        //未发生重复,遍历下一个节点,记录pPreNode            if(!needDelete){                pPreNode=pNode;                pNode=pNode->next;            }            else{                //发生重复                int value=pNode->val;//记录重复值                                ListNode* pToBeDel=pNode;  //记录要删除的结点                                //删除重复的结点                while(pToBeDel!=NULL && pToBeDel->val==value){                    pNext=pToBeDel->next;                                        delete pToBeDel;                    pToBeDel=NULL;                    pToBeDel=pNext;                }                                //头结点是重复的结点                if(pPreNode==NULL)                    pHead=pNext;                else                    pPreNode->next=pNext;                                pNode=pNext;            }        }                return pHead;    }};

阅读全文
0 0
原创粉丝点击