Leetcode之remove系列

【思想】 remove(删除元素=保留不需要删除的元素)。

1.对一个有序数组删除其中重复的元素

【代码】

#include<stdio.h>

int remove(int a[],int Len)
{
	int indexa;
	int index=0;
	for(indexa=0;indexa<Len;indexa++)
	{
		a[index]=a[indexa];
		while(a[index]==a[indexa+1])//不能用if,这里是循环判断是否与后面的相同
			indexa++;
		index++;
	}
	return index;
}
void main()
{
	int a[]={1,2,3,3,4,4,4,5};
	int result;
	result=remove(a,8);
	printf("the length is %d\n",result);
	for(int i=0;i<result;i++)
		printf("%d ",a[i]);
	printf("\n");
}

2.对一个有序数组删除重复出现超过2次的数,输入{1,1,1,2,2,5},输出{1,1,2,32,5}

【代码】

#include<stdio.h>

int remove(int a[],int Len)
{
	int indexa;
	int index=1;
	for(indexa=1;indexa<Len;indexa++)
	{
		a[index]=a[indexa];
		while(a[index-1]==a[indexa+1])//不能用if,这里是循环判断是否与后面的相同
			indexa++;
		index++;
	}
	return index;
}

void main()
{
	int a[]={1,1,1,2,2,5};
	int result;
	result=remove(a,6);
	printf("the length is %d\n",result);
	for(int i=0;i<result;i++)
		printf("%d ",a[i]);
	printf("\n");
}

3.对一个有序链表,删除其中重复的结点

设置相邻的两个指针,一个指针用于从头到尾遍历链表,另一个指针是后一个指针用于满足条件时删除结点

【代码】

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
	int data;
	struct node *next;
}Node;

//由于肯定不会删除第一个结点,故可以不用头结点。
int remove(Node *head,int n)
{
	Node *p,*q;
	p=head;
	q=head->next;
	while(q)	
	{
		while(p->data==q->data)
		{
			p->next=q->next;
			delete(q);
			q=p->next;
			n--;
		}
		p=p->next;
		q=q->next;
	}
	return n;
}

void main()
{
	Node *head;
    Node *node1=(Node *)malloc(sizeof(Node));
    Node *node2=(Node *)malloc(sizeof(Node));
    Node *node3=(Node *)malloc(sizeof(Node));
    Node *node4=(Node *)malloc(sizeof(Node));
    Node *node5=(Node *)malloc(sizeof(Node));

	node1->data=1;
	node2->data=2;
	node3->data=2;
	node4->data=2;
	node5->data=3;

	head=node1;
	node1->next=node2;
	node2->next=node3;
	node3->next=node4;
	node4->next=node5;
	node5->next=NULL;

	int n=5;
	int result;
	int i;
	result=remove(head,n);
	for(i=0;i<result;i++)
	{
		printf("%d ",head->data);
		head=head->next;
	}
	printf("\n");
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值