#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;
}
剑指offer面试题18(2)---删除链表的重复节点
猜你喜欢
转载自blog.csdn.net/qq_34793133/article/details/80831825
今日推荐
周排行