面试题18: 删除链表节点:删除链表中重复的节点

本文介绍了一种在排序链表中删除重复节点的方法。通过一次遍历,检查当前节点与其后继节点是否值相等,若相等则进行删除操作,确保链表元素唯一性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*******************************************************************
*《剑指Offer——名企面试官精讲典型编程题》C++代码
*
* htfeng
* 2018.09.28
*
* 面试题18: 删除链表节点
* 题目二:删除链表中重复的节点,在一个排序的链表中如何删除重复的节点。
*
* 分析:从头遍历整个链表,如果当前节点的与下一个节点的值相同,那么他
* 们就是重复的节点,都可以被删除。
*******************************************************************/
struct ListNode {
	int m_nValue;
	ListNode* m_pNext;
};

class Solution {
public:
	void DeleteDuplication(ListNode** pHead) {
		if (pHead == nullptr || *pHead == nullptr)
			return;

		ListNode* preNode = nullptr;
		ListNode* pNode = *pHead;
		while (pNode != nullptr) {
			ListNode* pNext = pNode->m_pNext;
			bool needDelete = false;

			if (pNext != nullptr && pNext->m_nValue == pNode->m_nValue)
				needDelete = true;

			if (!needDelete) {
				preNode = pNode;
				pNode = pNode->m_pNext;
			}
			else {
				int value = pNode->m_nValue;
				ListNode* pToBedel = pNode;
				while(pToBedel != nullptr && pToBedel->m_nValue == value) {
					pNext = pToBedel->m_pNext;
					delete pToBedel;
					pToBedel = nullptr;
					pToBedel = pNext;
				}

				if (preNode == nullptr)
					*pHead = pNext;
				else
					preNode->m_pNext = pNext;

				pNode = pNext;
			}
		}
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值