题目描述:
给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。
样例:
给出 1->2->3->3->4->4->5->null,返回 1->2->5->null
给出 1->1->1->2->3->null,返回 2->3->null
思路讲解:
这个题目很容易就理解题目意思,但是实际做起来,不知道从何入手,首先我们的意思就是直接将链表中的重复的元素删除,这样就需要我们记住该节点前面的一个链表节点,但是这就会很繁琐。
故我的方法是将所有的节点信息都放入vector向量中,然后对其进行分类分成两类即需要删除的以及不需要删除的,然后我们再将不需要删除的提取出来,然后将其进行链表连接即可,最后返回这个vector向量的首元素即可。
具体代码如下:
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param head: head is the head of the linked list
* @return: head of the linked list
*/
ListNode * deleteDuplicates(ListNode * head) {
// write your code here
if(head==NULL)
{
return NULL;
}
ListNode *p;
p=head;
vector<ListNode *> res;//存储节点的向量数组
while(p!=NULL)
{
res.push_back(p);
p=p->next;
}
int *flag=new int[res.size()];//由于我们需要判断那个节点需要删除,所以我们引入一个辅助数组,其标识具体位置是否需要删除
for(int i=0;i<res.size();i++)
{
flag[i]=0;
}
int f=0;//标识这个数字前面是否出现了
for(int i=1;i<res.size();i++)
{
if(res[i]->val==res[i-1]->val)
{
flag[i-1]=1;
f=1;
}
if(res[i]->val!=res[i-1]->val&&f==0)
{
flag[i-1]=0;
}
if(res[i]->val!=res[i-1]->val&&f==1)
{
flag[i-1]=1;
f=0;
}
}
if(f==1)
{
flag[res.size()-1]=1;
}
else
{
flag[res.size()-1]=0;
}
vector<ListNode *> array;//将不需要删除的节点保存到该向量数组中
for(int i=0;i<res.size();i++)
{
if(flag[i]==0)
{
array.push_back(res[i]);
}
}
if(array.size()==0)
return NULL;
for(int i=0;i<array.size()-1;i++)//对筛选出来的数组进行连接
{
array[i]->next=array[i+1];
}
array[array.size()-1]->next=NULL;//尾节点的特殊处理
return array[0];
}
};