【剑指offer56 删除链表中重复的节点】

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
 
注意如果是头结点的判断
另外,每次->next的时候都需要判断当前节点是否为空
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
    if(!pHead || !pHead->next) return pHead;
     
    ListNode *pre = pHead; //指向前面最晚访问过的不重复结点
    ListNode *left = pHead; //指向当前处理的结点
    ListNode *right = NULL; //指向当前处理结点后面结点
 
    while( left != NULL )
    {
        //当前结点left,(其实是left指向当前结点),与它下一个结点val相同,说明要删掉有这个val的所有结点
        if( left->next && left->next->val == left->val )
        {
            right = left->next;
            //找到最后一个需要删除的节点 right
            while( right && right->next && right->next->val == left->val )
            {
                right = right->next;
            }
 
            //如果left指向链表中第一个元素,left -> ... -> right ->... ,  将指向链表第一个元素的指针pHead指向right->next。
            if( left == pHead )
            {
                pHead = right->next;
            }
            else//如果left不指向链表中第一个元素,head -> pre->left ->...->right ->... 即pre->next = right->next
            {
                pre->next = right?right->next:NULL;
            }
            //当前处理的left要更新
            left = right->next; //即pre->next
        }
        else //left下一个和left不相同
        {
            pre = left;
            left = pre->next; //一定不能写成right->next
        }
    }
    return pHead;
    }
};

 

posted @ 2020-06-15 20:35  Stephen~Jixing  阅读(116)  评论(0编辑  收藏  举报