タイトル説明
ソートされたリストを指定すると、すべてのノードが唯一のデジタル元のリストが繰り返しされていないままに、繰り返しの数字が含まれて削除します。
例:
输入: 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;
}
};