您的位置:首页 > 编程语言 > C语言/C++

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

2015-07-17 23:16 447 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode