【leetcode c++】82 Remove Duplicates from Sorted List II

Remove Duplicates from Sorted List II

Given a sorted linked list, delete allnodes that have duplicate numbers, leaving only distinct numbers from theoriginal list.

 

For example,

Given1->2->3->3->4->4->5, return 1->2->5.

Given 1->1->1->2->3, return2->3.

 

又是二号题,刚好是在一号题的下面,就手滑进来做了。跟Remove Duplicates from Sorted 【Array】 II 这题稍微不一样,【Array】 II是要求保留2个重复元素,这题是要求删除凡是重复的元素。

 

首先考虑需要维护的指针数,如果我们只维护一个指针,判断->val == ->next->val 的话可以的,但是,如果->val == ->next->val成立的话,也就是说,至少,当前元素和下一个元素是需要删除的,只有一个指针的话,删除不了单向链表中当前所指元素(除非从头再扫过来,这样效率就爆炸了)。所以我需要一个辅助的指针,这个指针指向扫描指针的前一个节点(如果有的话),来帮助删除当前节点的情况。当然,还需要一个指针作为返回。

 

因为剧情需要,我们还需要两个bool变量 isHrad 和 isBad,来标记当前节点是不是‘头’和当前节点是不是该删除。初始化isHrad= true 。isBad = false。我们让head指针向后扫描。记得做越界判断。

 

我的思路千言万语只化作一张图,一共有6种情况,只有两种情况的指针操作是一样的。



Leetcode的AcceptedSolutions Runtime Distribution


源码:

#include <iostream>

using namespace std;

struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}
};

ListNode* deleteRule(ListNode* head);
ListNode* deleteDuplicates(ListNode* head);

int main()
{
	ListNode l1(1);
	ListNode* pl1 = &l1;
	ListNode l2(2);
	ListNode* pl2 = &l2;
	ListNode l3(1);
	ListNode* pl3 = &l3;

	pl1->next = pl2;

	cout << deleteDuplicates(pl1)->val;

	return 0;
}

ListNode* deleteDuplicates(ListNode* head){
	//
	//leetcode 83 
	//Remove Duplicates from Sorted List
	//
	/*
	if (NULL == head) return NULL;

	ListNode* res = head;
	while (head->next)
	{
		if (head->val == head->next->val)
		{
			head->next = head->next->next;
		}
		else
		{
			head = head->next;
		}
	}
	return res;
	*/

	///
	//leetcode 82 
	//Remove Duplicates from Sorted List ii
	///
	return deleteRule(head);
}

ListNode* deleteRule(ListNode* head){
	ListNode* res = head;
	ListNode* pre = NULL;
	bool isHead = true;
	bool isBad = false;
	while (head)
	{
		if (head->next && head->val == head->next->val)
		{
			isBad = true;
			if (isHead)
			{
				head = head->next;
				res = head;
			}
			else
			{
				head->next = head->next->next;
			}
		}
		else
		{
			if (isBad && isHead)
			{
				head = head->next;
				res = head;
				isBad = false;
			}
			else if (isBad && !isHead)
			{
				pre->next = head->next;
				head = pre->next;
				isBad = false;
			}
			else if (!isBad && isHead)
			{
				pre = head;
				res = head;
				head = head->next;
				isHead = false;
			}
			else
			{
				pre = head;
				head = head->next;
			}
		}
	}
	return res;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值