删除重复节点(保留重复节点)
例如:
原链表为:1->2->2->3->3
删除后为:1->2->3
注释较为详细,话不多说,直接上菜
//已排好序的链表,删除重复节点(保留重复节点)
#define _CRTDBG_MAP_ALLOC//检测内存泄漏
#include<iostream>
using namespace std;
//节点类
class ListNode
{
public:
ListNode(int value, ListNode* pNext)
{
this->m_Value = value;
this->m_pNext = pNext;
}
int m_Value;
ListNode* m_pNext;
};
ListNode* deleteDuplication(ListNode* head)
{
if (head == NULL || head->m_pNext == NULL)
return NULL;
//定义一个辅助根节点root,防止head节点就是重复节点,
ListNode* root = new ListNode(0, head);
ListNode* pre = root;
ListNode* cur = head; //定义当前节点即为头结点,从头结点开始
while (cur->m_pNext != NULL)
{
if (cur->m_Value == cur->m_pNext->m_Value)//当前节点的vlue与下一节点的value相等
{
ListNode* temp = cur; //由于当前节点的内存需要释放,而cur后续要用得到,因此先让temp维护当前节点
pre->m_pNext = cur->m_pNext;
cur = cur->m_pNext;
delete temp; //cur中的值全部保存好之后,再释放这块内存
temp = NULL;
}
else //不相等的话,直接往后推
{
pre = pre->m_pNext;
cur = cur->m_pNext;
}
}
ListNode* newHead = root->m_pNext;
delete root;
return newHead;
}
//遍历链表中的value值
void DisplayList(ListNode* head)
{
if (head == NULL)
return;
ListNode* temp = head;
while (temp != NULL)
{
cout << temp->m_Value << " ";
temp = temp->m_pNext;
}
cout << endl;
}
//测试函数
void test()
{
ListNode* node5 = new ListNode(2, NULL);
ListNode* node4 = new ListNode(2, node5);
ListNode* node3 = new ListNode(2, node4);
ListNode* node2 = new ListNode(1, node3);
ListNode* node1 = new ListNode(1, node2);
DisplayList(node1);
ListNode* newHead = deleteDuplication(node1);
DisplayList(newHead);
}
int main()
{
//_CrtSetBreakAlloc(158);//定位泄漏位置
test();
_CrtDumpMemoryLeaks(); //检测内存是否发生泄漏
system("pause");
return 0;
}