【剑指Offer】面试题57:删除链表中重复的结点

一:题目描述

在一个排序的链表中,如何删除重复的结点?

如  1->2->3->3->4->4->5

删除重复的结点后链表变成:

1->2->5


二:解题思路

如果当前节点的值与下一个结点的值相同,那么他们就是重复的结点,都可以被删除。

为了保证删除后链表仍然是相连的没有断开,我们要把当前节点的前一个节点和侯敏值比他大的结点相连。、


需要注意:

1.输入空链表

2.删除的结点可能是头结点

3.删除后链表可能为空。


三:代码实现

ListNode*  deleteRepeatNode(ListNode * head){

	

	if (head == NULL)
		return NULL;

	ListNode* deletedHead = head;
	ListNode* pPreNode = NULL;
	ListNode* pNode = head;

	while (pNode != NULL){
		ListNode* pNext = pNode->next;
		bool needDelete = false;
		if (pNext != NULL && pNext->val == pNode->val)
			needDelete = true;

		if (!needDelete){
			pPreNode = pNode;
			pNode = pNode->next;
		}
		else{
			int val = pNode->val;
			ListNode* pToBeDel = pNode;
			while (pToBeDel != NULL && pToBeDel->val == val){
				pNext = pToBeDel->next;
				//删除指针空间,并将指针置为NULL,防止野指针现象
				delete pToBeDel;
				pToBeDel = NULL;

				pToBeDel = pNext;
			}

			//原始头结点被删除
			if (pPreNode == NULL)
				deletedHead = pNext;
			else
				pPreNode->next = pNext;

			pNode = pNext;
		}//else
	}//while
	return deletedHead;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值