ソートチェーンテーブルで重複するノードを削除(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の中で同じ判断を指す.
最後にチェーンテーブルの最後のノードを空にします.
コード:
#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;
}