[リスト] LeetCode削除は、要素IIを繰り返すのリストをソート

タイトル説明

ソートされたリストを指定すると、すべてのノードが唯一のデジタル元のリストが繰り返しされていないままに、繰り返しの数字が含まれて削除します。
例:

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

トピックリンクhttps://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/
この問題を行う前に、あなたが最初に行うことができます削除は、要素の繰り返しのリストソートし問題解決を

思考

これは、「安全上のオファーを証明する」のトピックに関する質問です。ノードpreNode、次のノードNEXTNODE現在のノードの前に、現在のノードcurNode、現在のノード:私たちは、3つのポインタを保存する必要があります。リストのすべてがそうリストが空で削除した後、要素を繰り返すことができるので、元のノードnewHeadヘッドノードヘッドに新しいヘッドポイントを構築する必要があります。最初newHeadは頭部>次NEXTNODEを割り当て、そして判定するcurNode-> VALおよびnextNode-> valが等しい、等しい場合、反復要素を示すために、次にNEXTNODEに移動し、見つかった、preNode、curNodeが割り当てヘッドを割り当てcurNode->最初のノード異なるヴァル、次いでポインタを更新し、異なるNEXTNODEヴァルのcurNode場合、ポインタが更新されます。更新ポインタに(重複する要素がある場合)、両方の場合におけるように注意異なる方法、特定のコードを参照してください。

/**
 * 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