ソートチェーンテーブルで重複するノードを削除(C++)
タイトル:
ソートされたチェーンテーブルに重複するノードが存在する場合は、チェーンテーブルの重複するノードを削除し、重複するノードは保持されず、最後にチェーンテーブルヘッダポインタに戻ります.
次のようになります.
チェーンテーブル1->2->3->3->4->4->5
出力は1->2->5
考え方:
補助ポインタの定義:p pre qとresHead.初期時pとpreはチェーンヘッダポインタを指す.
resHead初期化値は-1です.(ヘッドノード前のノード)
次にチェーンテーブルを順に巡回します.pは常に現在遍歴しているノードを指す.
A pとpの次のノード値が等しい場合=>後方に遍歴する.p = p -> next
そうでなければ
B pの次のノードが存在する場合はpreとpが等しいか否かを判断する.(同じノード)
等しい=>は、このノードがpをqに繰り返しリンクするわけではないことを示す.
C pの次のノードが存在しないことは,最後のノードまで遍歴したことを示す.Bの中で同じ判断を指す.
最後にチェーンテーブルの最後のノードを空にします.
コード:
ソートされたチェーンテーブルに重複するノードが存在する場合は、チェーンテーブルの重複するノードを削除し、重複するノードは保持されず、最後にチェーンテーブルヘッダポインタに戻ります.
次のようになります.
チェーンテーブル1->2->3->3->4->4->5
出力は1->2->5
考え方:
補助ポインタの定義:p pre qとresHead.初期時pとpreはチェーンヘッダポインタを指す.
resHead初期化値は-1です.(ヘッドノード前のノード)
次にチェーンテーブルを順に巡回します.pは常に現在遍歴しているノードを指す.
A pとpの次のノード値が等しい場合=>後方に遍歴する.p = p -> next
そうでなければ
B pの次のノードが存在する場合はpreとpが等しいか否かを判断する.(同じノード)
等しい=>は、このノードがpをqに繰り返しリンクするわけではないことを示す.
C pの次のノードが存在しないことは,最後のノードまで遍歴したことを示す.Bの中で同じ判断を指す.
最後にチェーンテーブルの最後のノードを空にします.
コード:
#include <iostream>
using namespace std;
typedef int dataType;
struct DulNode
{
dataType val;
struct DulNode *next;
DulNode(dataType _val):
val(_val), next(NULL){}
};
void buildLink(DulNode **head)
{
dataType _val;
cin>>_val;
if (_val == -1)
{
*head = NULL;
return;
}
DulNode *p = NULL;
while(_val != -1)
{
DulNode *tmp = (DulNode*)malloc(sizeof(DulNode));
tmp->val = _val;
if (*head == NULL)
{
p = tmp;
*head = tmp;
}
else
{
p->next = tmp;
p = p->next;
}
cin>>_val;
}
p->next = NULL;
}
void traverseLink(DulNode *head)
{
DulNode *p = head;
while(p)
{
cout<<(p->val)<<" ";
p = p->next;
}
cout<<endl;
}
DulNode* deleteDuplication(DulNode *pHead)
{
if (pHead == NULL || pHead->next == NULL)
{
return pHead;
}
DulNode *p = pHead;
DulNode *pre = p;
DulNode *resHead = new DulNode(-1); //
DulNode *q = resHead;
while(p != NULL)
{
// p
if (p->next && p->val == p->next->val)
{
p = p->next;
}
else if(p->next)
{
// p
if (pre == p)
{
//
q->next = new DulNode(p->val);
q = q->next;
}
// pre p
pre = p->next;
p = p->next;
}
//
else
{
//
if (pre == p)
{
q->next = new DulNode(pre->val);
q = q->next;
}
break;
}
}
//
q = NULL;
return resHead->next; //
}
int main(void)
{
DulNode *head = NULL;
buildLink(&head);
traverseLink(head);
head = deleteDuplication(head);
traverseLink(head);
return 0;
}