53、删除链表中重复的结点

题目描述:

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

解题思路:

  需要三个指针,一个指向前一个节点pleft,一个指向当前节点pHead,一个指向当前节点的下一个节点pright,如果遇到相等的节点,pright向后移动,pleft不动,遇到不是连续相等的节点,就将pleft指向pright。

  注意:链表开头可能就开始有重复的节点,所以默认pleft=null,在后面的给pleft赋值的时候,若pleft为null,那就把pHead设置为pright。

Demo:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead){
        ListNode *p = pHead, *pleft = nullptr, *pright = nullptr;
        while (p != nullptr){
            bool flag = false;
            pright = p->next;
            // 有连续重复的结点,则不断更新pright
            while (pright != nullptr && p->val == pright->val){
                flag = true;
                pright = pright->next;
            }
            // 如果有重复结点
            if (flag){
                // 表示已经找到头结点了,让pleft直接指向pright即可
                if (pleft != nullptr)
                    pleft->next = pright;
                else
                    pHead = nullptr;
            }else{
                // 经历过多次重复结点或者没有经过重复结点后,
                // 当前结点和下一个结点不重复,则当前结点是新的头结点
                if (pleft == nullptr)
                    pHead = p;
                // 更新pleft
                pleft = p;
            }
            // 更新p
            p = pright;
        }
        return pHead;
    }
};

猜你喜欢

转载自blog.csdn.net/daaikuaichuan/article/details/89763209