leetcode-删除链表中重复的结点-20

题目要求
  在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路
  链表如果是空,链表返回空。链表只有一个元素时,也不可能重复,直接返回就可以。如果为多个元素时,设置一个cur指针和cur的下一个结点的next指针,判断只两个值是否相等,如果不相等,两个指针都往后移动一步,直到cur为NULL,如果相等,我们将next指针后移,接着判断cur和next是否相等,直到找到和cur不相等的next指针,然后还需要记录cur的前驱结点,将cur的前驱结点到next之间的结点全部释放,注意,如果链表一上来就是相等的,需要修改头结点。重复上述操作,直到cur为NULL。
图解
在这里插入图片描述
代码实现

class Solution {
public:
	ListNode* deleteDuplication(ListNode* pHead)
	{
		if (pHead == NULL || pHead->next == NULL)
		{
			return pHead;
		}

		ListNode* cur = pHead;
		ListNode* next = cur->next;
		ListNode* prev = NULL;

		while (next)
		{
			if (cur->val != next->val)
			{
				prev = cur;
				cur = next;
				next = next->next;
			}
			else
			{
				while (next && next->val == cur->val)
				{
					next = next->next;
				}

				//释放cur到next之间的重复的链表
				while (cur != next)
				{
					struct ListNode* node = cur;
					cur = cur->next;
					free(node);
				}

				if (prev == NULL)
				{
					pHead = cur;
				}
				else
				{
					prev->next = cur;
				}
			}
			if (cur)
			{
				next = cur->next;
			}
		}

		return pHead;
	}
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天津 唐秙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值