1.题目: 删除有序链表中重复的元素 (2)
描述
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为 1→2→3→3→4→4→5, 返回 1→2→5.
给出的链表为 1→1→1→2→3, 返回 2→3.
数据范围:链表长度 0 \le n \le 100000≤n≤10000,链表中的值满足 |val| \le 1000∣val∣≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
2.算法
暴力算法
3.算法思想
暴力清除
4.代码:
/*************************************************
作者:She001
时间:2022/10/4
题目: 删除有序链表中重复的元素 (2)
描述
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为 1→2→3→3→4→4→5, 返回 1→2→5.
给出的链表为 1→1→1→2→3, 返回 2→3.
数据范围:链表长度 0 \le n \le 100000≤n≤10000,链表中的值满足 |val| \le 1000∣val∣≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
***************************************************/
//算法:
//1.暴力算法:数据有序 从大到小
#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
int i;
node *next;
};
void print(node * head)//打印链表
{
node* pp= head;//复制头节点
while(pp!=NULL)//判断这个节点是否为空 链表是否结束
{
cout<<pp->i<<" ";
pp=pp->next;//指向下一个
}
cout<<endl;
}
int lianbiao_num(node * head)//函数的作用 返回链表的个数
{
int i=0;
node* pp=head;
while(pp!=NULL)
{
i++;
pp=pp->next;
}
//cout<<"链表中节点的个数: "<<i<<endl;
return i;
}
node * reverseList(node* head)//翻转链表
{
if(head==NULL)
{
return NULL;
}
node * a = head;
node * b = NULL;
while(a!=NULL)
{
node * c = a->next;
a->next=b;
b=a;
a=c;
}
return b;
}
//1.暴力算法:
//
node * fangfa_1(node * head)
{
if(head==NULL || head->next==NULL)//假如链表为空 或者只有一个节点 那么我们直接返回头节点
{
return head;
}
node * gg=new node;//建立一个表头
gg->i=-1;
node * k1= gg;
k1->next=head;//连接链表
while(k1!=NULL && k1->next!=NULL && k1->next->next!=NULL)//遍历节点
{
if((k1->next->i)==(k1->next->next->i))//判断数据是相同
{
node * k2=k1->next;
while((k2->next!=NULL) && (k2->i)==(k2->next->i))//把相同的数据给 排除完
{
k2=k2->next;//遍历下一个
}
k1->next=k2->next;//节点的连接
k1=k1->next;//下一个节点的操作
}
else
{
k1=k1->next;//遍历下一个节点
}
}
node * kkk=gg->next;
delete gg;//销毁建立的节点 防止存储空间的堵塞
return kkk;
}
int main()
{
//建立 第一个 单链表
node *a1=new node;
node *a2=new node;
node *a3=new node;
node *a4=new node;
node *a5=new node;
node *a6=new node;
node *a7=new node;
node *a8=new node;
node *a9=new node;
a1->i=1;//链表节点的复制
a2->i=2;
a3->i=3;
a4->i=3;
a5->i=4;
a6->i=5;
a7->i=6;
a8->i=6;
a9->i=7;
a1->next=a2;//链表的连接
a2->next=a3;
a3->next=a4;
a4->next=a5;
a5->next=a6;
a6->next=a7;
a7->next=a8;
a8->next=a9;//a5 是 两个链表的节点
a9->next=NULL;
node * k1= fangfa_1(a1);
print(k1);
return 0;
}