删除重复元素 保留只出现一遍的元素

img


要达成这样的效果 第三个的话总是前两个删不掉

void RD(Node** phead) {
    Node* p = *phead;
    Node* q = p->next;

    while (p != NULL && p->next != NULL)
    {
        if (p->data != p->next->data)//值不相等,p,q一起往后走 
        {
            q = p;
        }
        else//值相等
        {
            while (p->next != NULL && p->data == p->next->data)
            {
                p = p->next;
            }
            q->next = p->next;//将有重复的值的元素都跳过 
        }
        p = p->next;
    }
}

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

typedef struct Node
{
    int data;
    int lenth;
    struct Node* next;
}Node_t;

//开辟空间+初始化 
Node_t* AollocNode(int x)
{
    Node_t* p = (Node_t*)malloc(sizeof(Node_t));
    if (p == NULL)//检测是否开辟成功
    {
        perror("molloc");
    }
    p->data = x;
    p->next = NULL;
    return p;
}


//尾插法创建链表 2
void TailCreatList(Node_t** pend)
{
    int i = 0;
    int x = 0;
    int n = 0;
    printf("请输入初始化链表的个数");
    scanf("%d", &n);
    (*pend)->lenth = n;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &x);
        Node_t* p = AollocNode(x);
        (*pend)->next = p;
        *pend = p;
    }
}
//打印链表
void ShowList(Node_t* head)
{
    Node_t* p = head->next;
    while (p)
    {
        printf("%d->", p->data);
        p = p->next;
    }
    printf("NULL\n");
}
void DeReList(Node_t** phead)
{
    if ((*phead)->next == NULL)//对第一个节点进行判断
    {
        return;
    }
    Node_t* p = (*phead)->next->next;//指向第二个节点
    Node_t* p1 = (*phead)->next;//p的前驱
    Node_t* p2 = (*phead);//p1的前驱

    int flag = 1;
    int bedata = 0;//记录重复的数据
    while (p) 
    {
        flag = 1;
        if (p->data == p1->data || bedata == p1->data)
        {
            //用p4释放节点每次释放一个,p1,p指向后面的节点
            Node_t* p4 = p1;
            bedata = p1->data;
            //1 1 1 2
            p1 = p1->next;
            p = p1->next;
            p2->next = p1;
            

            free(p4);

            flag = 0;
            
        }
        if (flag)
        {
            p = p->next;
            p1 = p1->next;
            p2 = p2->next;
        }
    }
    //判断最后一个节点是否是重复的
    if (p1->data == bedata)
    {
        p2->next = p1->next;
        free(p1);
    }

}
int main()
{

    Node_t* head = AollocNode(0);
    Node_t* end = head;
    //尾插入创建
    TailCreatList(&end);//第二个图片是这个没有调用
    DeReList(&head);
    ShowList(head);
    free(head);
    return 0;
}

可以定义一个变量data等于第一个值,然后开始遍历,如果和后一个值相等,就删去后一个值,不相等的话就让他等于后一个值

if(p->next->data == data)
{
        p->next = p->next->next;
}
else
{
       data = p->next->data;
}

p = p->next;

这样

void RD(Node** phead)
{
    Node* p = *phead;
    Node* q = p->next;

    while (p != NULL && p->next != NULL)
    {
        int tem=p->next->data;
        if(p->next->data == tem)
        {
            p->next = p->next->next;
        }
        else
        {
            tem = p->next->data;
        }
        p = p->next;
    }
}

while (p != NULL && p->next != NULL)
{
int tem=p->next->data;
if(p->next->data == tem)
{
p->next = p->next->next;
}
else
{
tem = p->next->data;
}
p = p->next;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^