leetcode 虐我篇之(四)Remove Duplicates from Sorted List II

前面做了Remove Duplicates from Sorted List  今天就顺便把Remove Duplicates from Sorted List  II 也做一下。前面的第一个去重的可以参考我的前一篇文章。

题目的描述如下:

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.
题目也是讲得比较直白了。程序可以将上一篇的文章的代码改一下就好。但是就在这个改一下的过程中,我遇到了很多问题。总是没有很好的把结果正确输出。一开始我是加了有重复的标志位eq,然后又加了指针pre,写着写着感觉如果一开始就遇到重复的怎么办?然后就加了其它一堆判断条件和标志位,退出循环后,为了避免漏判断又加了一堆判断条件和标志位。在网站上提交了好几次,每次都会有问题。改来改去,好烦啊。正所谓浅水淹死大牛,何况我这种笨猪。后面搞了好久好久好久好久,终于想到怎么将判断条件加上去。后面提交的时候,看着pending的时候好紧张,结果出来Accepted的时候终于舒了口气。

代码如下:

ListNode *deleteDuplicates2(ListNode *head)
{
	if (!head)
	{
		return NULL;
	}

	ListNode *pt = head;	
	ListNode *pre = head;
	bool eq = false;
	//遍历链表
	while(pt!= NULL && pt->next)
	{		
		if (pt->val == pt->next->val)
		{
			pt->next = pt->next->next;	
			eq = true;
		}
		else
		{
			//如果前一次是有相同的情况
			if (eq)
			{
				//如果前一个指针和头结点指针相等的情况
				if (pre == head && pre == pt)
				{
					head = pt->next;
					pre = head;		
					pt = pre;
				}
				else
				{
					pre->next = pt->next;
					pt = pre->next;	
				}
				eq = false;				
			}
			else
			{
				pre = pt;
				pt = pre->next;
			}
					
		}	
		
	}

	//这里的判断是必须的,为了防止最后两个是相等的情况。
	if (eq)
	{
		if (pre == head  && pre == pt)
		{
			head = pt->next;
			pre = head;
		}
		else
		{
			pre->next = pt->next;
		}
	}
	
	return head;
}
代码中的注释比较少,但是代码还是比较清楚简单的。

看了一下时间,快十一点了。宿舍要关门了。就写到这里。唉,今晚被虐惨了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值