剑指offer面试题18(2)---删除链表的重复节点

#include <iostream>
using namespace std;

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

ListNode* CreateNode(int n_value)
{
	ListNode* node = (ListNode*)malloc(sizeof(ListNode));
	node->next = nullptr;
	node->value = n_value;

	return node;
}

void ConnectNode(ListNode* node1, ListNode* node2)
{
	node1->next = node2;
	node2->next = nullptr;
}

void DeleteDuplication(ListNode** pHead)
{
	if (pHead == nullptr&&*pHead!=nullptr)
		return;

	ListNode* PreNode = nullptr;
	ListNode* PNode = *pHead;

	while (PNode != nullptr)
	{
		ListNode* PNext = PNode->next;
		bool NeededDeleted = false;
		if (PNext != nullptr&&PNode->value == PNode->next->value)
		{
			 NeededDeleted = true;
		}

		if (!NeededDeleted)
		{
			PreNode= PNode;
			PNode = PNode->next;
		}

		else
		{
			ListNode* NeedToBeDel = PNode;
			int tmp_value = PNode->value;
			while (NeedToBeDel != nullptr&&NeedToBeDel->value == tmp_value)
			{
				PNext = NeedToBeDel->next;
				delete NeedToBeDel;
				NeedToBeDel = nullptr;

				NeedToBeDel = PNext;
			}
			
			if (PreNode == nullptr)
			{
				*pHead = PNext;
				PNode = PNext;
			}
			else
			{
				PreNode->next = PNext;
				PNode = PNext;

			}
		}
	}
	
}

void PrintList(ListNode* temp_print)
{
	if (temp_print == nullptr)
		printf("要打印的链表为空,请检查输入链表\n");


	else
	{
		ListNode* temp2 = temp_print;
		while (temp2 != nullptr)
		{
			printf("%d  ", temp2->value);
			temp2 = temp2->next;

		}

		printf("\n");
	}
}

void Test1()
{
	cout << "Test1:重复节点在中部  ";
	ListNode* node1 = CreateNode(1);
	ListNode* node2 = CreateNode(2);
	ListNode* node3 = CreateNode(3);
	ListNode* node4 = CreateNode(3);
	ListNode* node5 = CreateNode(4);
	ListNode* node6 = CreateNode(4);
	ListNode* node7 = CreateNode(5);

	ConnectNode(node1, node2);
	ConnectNode(node2, node3);
	ConnectNode(node3, node4);
	ConnectNode(node4, node5);
	ConnectNode(node5, node6);
	ConnectNode(node6, node7);

	ListNode* pHead = nullptr;
	pHead = node1;

	DeleteDuplication(&pHead);

	PrintList(pHead);
}

void Test2()
{
	cout << "Test2:重复节点在尾部  ";
	ListNode* node1 = CreateNode(1);
	ListNode* node2 = CreateNode(2);
	ListNode* node3 = CreateNode(3);
	ListNode* node4 = CreateNode(3);
	ConnectNode(node1, node2);
	ConnectNode(node2, node3);
	ConnectNode(node3, node4);

	ListNode* pHead = nullptr;
	pHead = node1;

	DeleteDuplication(&pHead);

	PrintList(pHead);
}

void Test3()
{
	cout << "Test3:重复节点在头部  ";
	ListNode* node1 = CreateNode(1);
	ListNode* node2 = CreateNode(1);
	ConnectNode(node1, node2);

	ListNode* pHead = nullptr;
	pHead = node1;

	DeleteDuplication(&pHead);

	PrintList(pHead);
}
void Test4()
{
	cout << "Test4:原始链表为空  ";

	ListNode* pHead = nullptr;

	DeleteDuplication(&pHead);

	PrintList(pHead);
}


int main()
{
	Test1();
	Test2();
	Test3();
	Test4();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34793133/article/details/80831825