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