剑指offer--删除链表中的重复节点

删除链表中重复的节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思想:首先这是一个排序的链表 ,也就是说,删完的节点,后面不会再出现。这一点很重要。其次,要删除当前节点,就要知道上一个节点,让上一个prev节点的next指向当前节点的下一个,从而达到把这个节点拿出链表,再删除。那么怎么判断这个节点是不是该删呢。这个节点和下一个节点相同,那么就删除该节点。但是这个判断条件,必然会留下最后一个节点删不掉。所以我们采用一个变量来存储这个要被删除变量的值,虽然这个节点被删掉了,但是如果下一个节点和该节点的值相同,同样删去即可。这里有一个特殊情况,所有的都一样,所以我们要单独判断一下头,不然虽然删了值,但是phead还指向,是个野指针啊,因为我们在判断时,是那当前位后它的下一个比较是否相同,所以while条件是next不能为NULL,那么最后一位也需要我们特殊处理。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead == NULL)
            return pHead;
        ListNode *cur = pHead;
        ListNode *prev = pHead;
        int count;
        while(cur->next!= NULL){
            if(cur->val == cur->next->val || cur->val == count){
                if(cur == pHead){
                    count = cur->val;
                    pHead = cur->next;
                    delete cur;
                    cur = pHead;
                }
                else{
                    count = cur->val;
                    prev->next = cur->next;
                    delete cur;
                    cur = prev->next;
                }
            }
            else{
                prev = cur;
                cur=cur->next;
            }
        }
        if(pHead->val == count)
            return NULL;
        if(cur->val == count)
        {
            prev->next = NULL;
            delete cur;
        }
        return pHead;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_40921797/article/details/81671465