删除链表中重复元素的两种操作

删除链表中重复元素的两种操作

#include<bits/stdc++.h>
using namespace std;
struct LNode
{
    int data;
    struct LNode *next;
};

void create(LNode *&L,int a[],int n)///尾插法建表
{
    LNode *r,*s;
    L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;
    r=L;
    for(int i=0; i<n; i++)
    {
        s=(LNode*)malloc(sizeof(LNode));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=NULL;
}
/***删除一个有序链表中重复元素***/
/***例如: 1 1 2 3 4 4 5 5  ***/
/*
void delete_elem(LNode *&L)
{
    LNode *p,*q;
    p=L->next;
    while(p->next!=NULL)
    {
        if(p->data==p->next->data)
        {
            q=p->next;
            p->next=q->next;
            free(q);
        }
        else
            p=p->next;
    }
}
*/
/***删除无序表中重复元素***/
/**算法思想:
设置两个指针变量p,q;
用q后移找与p相同相同就删除并继续向后找直到遍历到链表尾
第一个重复查找删除完成此时p向后移q=p重复上述过程
例如 1 2 3 2 3 4 5 4 1 2
***/
/*
void delete_element(LNode *&L)
{
    LNode *p,*q,*r,*s;
    p=L->next;
    while(p->next!=NULL)
    {
        q=p;
        while(q->next!=NULL)
        {
            if(p->data==q->next->data)
            {
                r=q->next;
                q->next=r->next;
                free(r);
            }
            else
                q=q->next;
        }
        p=p->next;
///输出中途过程验证
//        s=L;
//        while(s->next!=NULL)
//        {
//            printf("%d ",s->next->data);
//            s=s->next;
//        }
//        printf("\n");
    }
}
int main()
{
    int n,a[100];
    scanf("%d",&n);
    for(int i=0; i<n; i++)
        scanf("%d",&a[i]);
    LNode *L;
    create(L,a,n);
    ///delete_elem(L);
    delete_element(L);
    while(L->next!=NULL)
    {
        printf("%d ",L->next->data);
        L=L->next;
    }
    printf("\n");
    return 0;
}

删除链表中的最大值和最小值

/***
6
2 1 6 5 3 4
minn==1
maxm==6
2 5 3 4
***/
#include<bits/stdc++.h>
using namespace std;

#include<bits/stdc++.h>
using namespace std;
struct LNode
{
    int data;
    struct LNode *next;
};

void create(LNode *&L,int a[],int n)///尾插法建表
{
    LNode *r,*s;
    L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;
    r=L;
    for(int i=0; i<n; i++)
    {
        s=(LNode*)malloc(sizeof(LNode));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=NULL;
}
void deletmin(LNode *&L)
{
    LNode *pre,*minn,*p,*minpre; 
    // pre:p节点的前驱节点,minpre:minn的前驱节点
    pre=L;
    p=L->next;
    minn=p;
    int flag=0;//标记第一个节点是否为最小值
    while(p!=NULL)
    {
        if(p->data < minn->data)
        {
            flag=1;
            minn=p;
            minpre=pre;
        }
        pre=p;
        p=p->next;
    }
    printf("minn==%d\n",minn->data);
    if(flag==0)
        L->next=minn->next;
    else
        minpre->next=minn->next;
    free(minn);
}
void deletmax(LNode *&L)
{
    LNode *pre,*p,*maxpre,*maxm;
    pre=L;
    p=pre->next;
    maxm=p;
    int flag=0; //标记第一个节点是否为最大值
    while(p)
    {
        if(p->data > maxm->data)
        {
            flag=1;
            maxm=p;
            maxpre=pre;
        }
        pre=p;
        p=p->next;
    }
    printf("maxm==%d\n",maxm->data);
    if(flag==0)
        L->next=maxm->next;
    else
        maxpre->next=maxm->next;
    free(maxm);
}
int main()
{
    int n,a[100];
    scanf("%d",&n);
    for(int i=0; i<n; i++)
        scanf("%d",&a[i]);
    LNode *L;
    create(L,a,n);

    deletmin(L);
    deletmax(L);
    while(L->next!=NULL)
    {
        printf("%d ",L->next->data);
        L=L->next;
    }
    printf("\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值