关于链表去重的操作

发布时间:2024年01月05日

?整个链表以及去重操作:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>

typedef struct _con
{
    int data;
    struct _con* next;
}con;
//尾插法
con* createlist(int n)
{
    con* head, * p, * tail;
    head = tail = NULL;
    int i = 0;
    for (i = 0; i < n; i++)
    {
        p = (con*)malloc(sizeof(con));
        p->next = NULL; // 添加这一行,初始化指针
        scanf("%d", &p->data);

        if (head == NULL)
        {
            head = tail = p;
        }
        else
        {
            tail->next = p;
            tail = p;
        }
    }
    return head;
}
void printList(con* head) {
    while (head != NULL)
    {
        printf("%d -> ", head->data);
        head = head->next;
    }
    printf("NULL\n");
}

con* single(con* head)
{
    con* p = head->next;
    con* q = head;//临时结点
    int a[100] = { 0 };//链表内的数据是100以内的,如果需求不同,可自行更改;
    //这里用一个判断数组,先假设所有数字都没出现过,赋初值为0;

    if (head == NULL) {
        return head; // 如果链表为空,则直接返回空指针
    }

    while (p)
    {
        if (a[p->data] == 0)
        {
            a[p->data] = 1;
            q = p;
            p = p->next;
        }
        else //就要去掉这个数据;去掉结点p;
        {
            q->next = p->next;
            free(p);
            p = q->next;
        }
    }
    return head;
}

int main()
{
    int n;
    scanf("%d", &n);

    con* head = NULL;

    head = createlist(n);

    head = single(head);

    printList(head);

    return 0;
}

?其中,最主要的去重部分我单拿出来:

con *single(con *head)
{
    con* p = head->next;
    con* q = head;//临时结点
    int a[100] = { 0 };//链表内的数据是100以内的,如果需求不同,可自行更改;
    //这里用一个判断数组,先假设所有数字都没出现过,赋初值为0;

    if (head == NULL) {
        return head; // 如果链表为空,则直接返回空指针
    }

    while (p)
    {
        if (a[p->data] == 0)
        {
            a[p->data]=1;
            q = p;
            p = p->next;
        }
        else //就要去掉这个数据;去掉结点p;
        {
            q->next = p->next;
            free(p);
            p=q->next;
        }
    }
    return head;
}

这里怎么理解呢?最主要的就是else之后的去点部分:

我们首先有q,p这两个指针,而且q在p前面,也就是说,我们用p来遍历链表,一旦发现p的数据出现过了,我们就要去掉p这个结点,去点的操作就是:q->next=p->next;中间把p释放掉;最重要的就是:p=q->next;这里是让q这个指针继续发挥遍历的作用,指向被删除的结点的下一个结点;

文章来源:https://blog.csdn.net/2303_79380171/article/details/135397906
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。