【LeetCode链表】删除排序链表中的重复元素 II

题目描述

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

题目链接https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/
做这题之前,可以先做删除排序链表中的重复元素题解.

思路

这题是《剑指Offer》上的一道题。我们需要保存3个指针:当前结点curNode、当前结点的前一个结点preNode、当前结点的下一个结点nextNode。由于链表中可能全部是重复的元素,这样的话删除后链表为空,所以需要构造一个新的头结点newHead指向原来的头结点head。首先将newHead赋给preNode, head赋给curNode, head->next赋给nextNode,然后判断curNode->val与nextNode->val是否相等,如果相等的话说明找到了重复元素,这时将nextNode移动到与curNode->val不同的第一个结点,然后更新指针;如果curNode和nextNode的val不同,则更新指针。注意,两种情况下(是否有重复元素)指针的更新方式不同,具体见代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head==nullptr){
            return nullptr;
        }

        ListNode* newHead = new ListNode(0);
        newHead->next = head;
        ListNode* preNode = newHead;
        ListNode* curNode = head;
        ListNode* nextNode = curNode->next;
        while(nextNode!=nullptr){
            bool findRepeat = false;    // 是否找到重复节点
            while(curNode!=nullptr && nextNode!=nullptr && curNode->val==nextNode->val){
                nextNode = nextNode->next;
                flag = true;
            }
            if(findRepeat){ //找到重复节点
                curNode = nextNode; 
                preNode->next = curNode;
            }else{  // 没找到重复节点
                preNode = curNode;
                curNode = nextNode;
            }
            if(nextNode!=nullptr){  // 更新nextNode
                nextNode=nextNode->next;
            }
        }
        return newHead->next;
    }
};

猜你喜欢

转载自www.cnblogs.com/flix/p/12670568.html
今日推荐