在之前我们曾经做过一道与该题近乎一模一样的题目,不过不同的是,该题所给的链表并未排序过
像这种去除重复元素的题目,其实以前在学习C语言数组的时候也做过类似的,我们常用的解法是使用嵌套循环,即一个结点作为标准,另外一个结点参照该标准,如果两个结点的val相同,我们就去除该结点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeDuplicateNodes(ListNode* head) {
if(head==NULL)//排除空链表情况
{
return NULL;
}
ListNode* p1=head;
while(p1!=nullptr)
{
ListNode* p2=p1;
while(p2->next!=nullptr)
{
if(p2->next->val==p1->val)
{
p2->next=p2->next->next;//直接链接下下个结点
}
else
{
p2=p2->next;
}
}
p1=p1->next;
}
return head;
}
};
只不过该方法耗时较长,有种时间换空间的赶脚
法2 book记录
我们可以开一个数组来记录某一个点是否出现过
我们只需遍历链表,如果一个结点的值没走过就记录一下,否则就继续遍历
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeDuplicateNodes(ListNode* head) {
if(head==NULL)//排除空链表情况
{
return NULL;
}
vector<int>book(20005);//初始化
ListNode *slow=head;
ListNode *fast=head->next;
book[slow->val]=1;//初始化
while(fast)
{
if(!book[fast->val])//没出现过
{
book[fast->val]=1;//记录
slow=fast;//slow和fast都向前一步走
fast=fast->next;
}
else
{
slow->next=fast->next;//来过了,所以我们跨过这个结点
fast=fast->next;//记得fast也要更新
}
}
return head;
}
};