删除链表中重复的节点

来源:互联网 发布:java web是什么 编辑:程序博客网 时间:2024/05/14 10:10

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

这个题目首先考虑到头结点也可能是重复的节点,所以需要设置一个头结点之前的节点。之后需要3个指针
pre,cur和next

/*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->next==NULL) //判断是否是空节点或者只有一个节点            return pHead;         ListNode* prehead=new ListNode(0); //设置头前节点        prehead->next=pHead;        ListNode* pre=prehead;        ListNode* cur=pre->next;        ListNode* next=cur->next;        while(cur!=NULL&&next!=NULL)     //如果当前节点或者next节点为空跳出循环            {            if(cur->val==next->val){     //如果出现重复节点一直向后找到以一个cur不等于next的节点            while(next!=NULL&&cur->val==next->val)                {                cur=cur->next;                next=next->next;            }            if(next==NULL)                cur=NULL;            else      //注意此时cur节点也是需要删除的节点,所以令cur=next;并且需要再次进行判断是否与后面的重复。                cur=next;                next=next->next;                            }            else    //如果不出现重复则将pre和cur链接,并且pre和cur和next分别向后移动,注意边界。            {            pre->next=cur;            pre=cur;            cur=next;            if(next!=NULL)            next=next->next;            }        }        pre->next=cur;   //最后需要将pre和cur链接起来,对于上面的判断条件,最后一步没有链接起来。        return prehead->next;     }};
0 0