删除链表中重复的节点

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

数据结构及初始化:

struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};

 

代码如下:

ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead==NULL)
            return NULL;
        ListNode *head=new ListNode(-1);//创建一个头结点,防止头结点被删除
        head->next=pHead;//创建的头结点初始化
        ListNode *pre=head;//两个操作指针pre和p
        ListNode *p=head->next;
        while(p&&p->next)
        {
            if(p->val==p->next->val)//如果p指向的值和p->next指向的值相同
            {
                int val=p->val;//保留当前的值,因为下面p会移动
                while(p&&p->val==val)
                    p=p->next;
                pre->next=p;//此时是p指向的值和val不相同,则让pre->next=p;间接删除了重复的节点
            }
            else//出现p指向的值和下一个值不相同,移动pre和p
            {
                pre=p;
                p=p->next;
            }
            
        }
        return head->next;//返回链表的头(不带头结点)
    }

 

posted @ 2017-08-30 09:14  泡面小王子  阅读(255)  评论(0编辑  收藏  举报