タイトル説明
ソートされたリンクリストが重複ノードリストを削除し、重複ノードにおいて、ノードは、繰り返しを保持しない、ヘッド・ポインタ・リストを返します。例えば、リスト1-> 2-> 3-> 3-> 4-> 4-> 5扱われ1-> 2-> 5
思考
- 定義ノードを保持するベクターは、現在、最初のノードから出発して、繰り返して、次の二つのポインタを定義することはできません、等しい場合には電流を見つけるまで、2つのノードが、、、次の動きのvalに等しいか否かを判断するに等しくありませんノード値は次の電流とがNULLであるかどうかを決定する、この方法の最後の欠点は、スキップ・ノードであり、したがって、サイクルする必要があることに留意すべきであるLAST_VALUEによって、ノードの値が繰り返されているかどうかを最終的な決意を完了する判断します。最後に、一緒に文字列にベクトル内のノード
- 再帰、実際には、同様のアイデア
コード
この方法の一つ
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead == NULL)
return NULL;
vector<ListNode*> L_node;
ListNode* current = pHead;
int last_value;
while(current != NULL && current->next != NULL)
{
ListNode* next = current->next;
if(current->val!=next->val)
{
L_node.push_back(current);
last_value = current->val;
current = next;
}
else
{
while(current->val==next->val)
{
if(next->next == NULL)
{
next = NULL;
break;
}
else
{
next = next->next;
}
}
current = next;
}
}
if(current != NULL && current->val != last_value)
L_node.push_back(current);
if(L_node.size() == 0)
return NULL;
else
{
for(int i = 0; i < L_node.size()-1;i++)
{
L_node[i]->next = L_node[i+1];
}
L_node[L_node.size()-1]->next = NULL;
return L_node[0];
}
}
};
方法2:
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (pHead==NULL)
return NULL;
if (pHead!=NULL && pHead->next==NULL)
return pHead;
ListNode* current;
if ( pHead->next->val==pHead->val){
current=pHead->next->next;
while (current != NULL && current->val==pHead->val)
current=current->next;
return deleteDuplication(current);
}
else {
current=pHead->next;
pHead->next=deleteDuplication(current);
return pHead;
}
}
};