编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1: 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3] 示例2: 输入:[1, 1, 1, 1, 2] 输出:[1, 2]
- 1
- 2
- 3
- 4
- 5
- 6
提示:
- 链表长度在[0, 20000]范围内。
- 链表元素在[0, 20000]范围内。
思路一:
head思路二:
s.count查询函数,返回的是一个整数,表示查询到元素的个数思路三:利用标记数组,标记当前值是否出现过
//提供完整的代码,可以在C编辑器中进行测试
#include
#include
using namespace std;
struct ListNode{
int val;
ListNode *next;
ListNode(int x) : val(x),next(NULL){}
};
class Solution{
public:
//方法一:
ListNode* removeDuplicateNodes(ListNode* head){
//判断是否需要遍历
if(head==NULL||head->next==NULL) return head;
ListNode* current = head;
while(current){//第一重循环:将第i个元素依次与后面元素进行比较(i从1到最后)
ListNode *p = current;
while(p->next){//第二重循环:与后1个比、后2个比、后三个比...与最后一个比
if(p->next->val == current->val){
p->next = p->next->next;//删除p后面这个重复的元素
}else{
p = p->next;//p后移
}
}
current = current->next;//将第i+1个元素开始依次与后面元素进行比较
}
return head;//这里返回的一定是head,此时的head后面的链表已经删除了重复的元素
}
//方法二:
ListNode* removeDuplicateNodes2(ListNode* head){
if(head==NULL||head->next==NULL) return head;
set s;
ListNode* p = head;
s.insert(p->val);
while(p->next){//只要还没到最后一个元素,就遍历
if(s.count(p->next->val)!=0){//包含了,则重复
p->next = p->next->next;
}else{ //不重复,添加进去、后移
s.insert(p->next->val); //或者可以先后移再添加,p=p->next;s.insert(p->val);
p = p->next;
}
}
return head;
}
//方法三:
ListNode* removeDuplicateNodes3(ListNode* head){
if(head==NULL||head->next==NULL) return head;
//利用val的值在0~20000之间,标记是否出现过
int index[20001] = {0};
index[head->val] = 1;
struct ListNode* q = head;
while(q->next){
//下一个val未出现过,保存下一个val
if(index[q->next->val]==0){
index[q->next->val] = 1;
q = q->next;
}else{ //下一个val出现过,删除下一个节点
q->next = q->next->next;
}
}
return head;
}
//链表打印函数
void ListPrintf(ListNode* head){
ListNode* pos = head;
while(pos){
cout<val<<"->";
pos = pos->next;
}
cout <<"NULL"<next!=NULL){
pos = pos->next;
}
pos->next = newNode;
}
}
};
int main(){
ListNode* test = new ListNode(1);
ListNode* result;
class Solution s;
s.ListBackInsert(&test,2);
s.ListBackInsert(&test,3);
s.ListBackInsert(&test,3);
s.ListBackInsert(&test,2);
s.ListBackInsert(&test,1);
s.ListPrintf(test);
result = s.removeDuplicateNodes(test);
//result = s.removeDuplicateNodes2(test);
//result = s.removeDuplicateNodes3(test);
s.ListPrintf(result);
return 0;
}
结果:
