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;
	}
};

猜你喜欢

转载自blog.csdn.net/weixin_43580319/article/details/113601242