(C++)剑指offer:删除链表中的重复节点(保留重复节点)

删除重复节点(保留重复节点)

例如:
原链表为: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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值