删除链表中的重复结点

struct ListNode
{
	int value;
	ListNode* next;
};

void DeleteDuplication(ListNode** pHead)
{
//判断输入是否合法
	if (pHead == nullptr&&*pHead == nullptr)
		return;
	ListNode* pNode = *pHead;
	ListNode* pPreNode = nullptr;
	while (pNode != nullptr)
	{
		ListNode* pNext = pNode->next;
//判断是否重复的标志,当重复时置true
		bool needDelete = false;
		if (pNext != nullptr&&pNext->value == pNode->value)
		{
			needDelete = true;
		}
//当needDelete为false时,继续下一个结点
		if (!needDelete)
		{
			pPreNode = pNode;
			pNode = pNode->next;
		}
//当结点重复时,删去该结点
		else
		{
			ListNode* ToBeDel = pNode;
			int value = ToBeDel->value;
			while (ToBeDel != nullptr&&ToBeDel->value == value)
			{
				pNext = ToBeDel->next;
				delete ToBeDel;
				ToBeDel = nullptr;
				ToBeDel = pNext;
			}
//当删除的结点是头节点,把头节点指向不重复的第一个结点,否则把pNode指向pNext
			if (pPreNode == nullptr)
				*pHead = pNext;
			else
				pNode->next = pNext;
//最后还要把pNext赋给pNode
			pNode = pNext;
		}
	}
}

 

你可能感兴趣的:(删除链表中的重复结点)