面试算法 牛客题目 删除有序链表中重复的元素 (2)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值