C语言_给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

/*2.给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };


struct ListNode* deleteDuplicates(struct ListNode* head){

}*/

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
int main(){//主函数开始
    //设定单链表
    struct ListNode {
        int val;
        struct ListNode *next;
    };

    struct ListNode Head,*p0,*p1,*p2;//head是头指针,p0是前指针,p1是现指针,p2是后指针

    Head.val=-1;
    Head.next=NULL;
    //deleteDuplicate函数开始
    struct ListNode* deleteDuplicates(struct ListNode* head){
        //最多n次循环,冒泡对比,有一个是内层的循环,有一个外层循环,外层循环执行的是录入n次,内层执行的是检测和前指向后
        //循环开始
        while(1){
            //把头指针变成前指针和现指针
            p0=p1=head;
            while(1){//内循环开始
                //如果现指针的数值与头指针一样就把前指针指向现指针指向的指针,前指针不变
                if(head->val==p1->val){
                    p0->next=p1->next;
                    //printf("Testsame\n");

                }
                //如果不一样就把现指针变成前指针,
                else{
                    p0=p1;
                    //printf("Testinsame\n");
                }
                //如果现指针指向的指针是空指针就终止内层循环
                if(p1->next==NULL){//printf("Testbreak\n");
                break;}
                //把现指针指向的指针变成现指针
                p1=p1->next;
                /**
                //把现指针指向的指针变成现指针
                p1=p1->next;
                //如果现指针是空指针就终止内层循环
                if(p1==NULL){//printf("Testbreak\n");
                break;}
                **/

            }//内循环结束
            //如果头指针指向的指针是空指针就终止循环
            if(head->next==NULL){break;}
            //把头指针指向的指针变成头指针
            head=head->next;

        }//循环结束
    }//deleteDuplicates函数结束

    //inputList函数开始
    struct ListNode* inputList(struct ListNode* head){
        //需要输入n个数字
        int n=0;
        printf("Please enter how many number do you want to:");
        scanf("%d",&n);
        //循环n-1次
        for(int i=1;i<=n-1;i++){
            //分配新空间给后指针
            p2=(struct ListNode*)malloc(sizeof(struct ListNode));
            //让现指针指向后指针
            head->next=p2;//printf("->");
            //输入现指针的数值
            scanf("%d ",&head->val);//printf("->");
            //让现指针指向的指针变成现指针
            head=head->next;
            //printf("->");
        }
        //最后一次输入数字
        scanf("%d",&head->val);
        head->next=NULL;
    }//inputList函数结束

    //outputList函数开始
    struct ListNode* outputList(struct ListNode* head){
        while(1){
            //判断现指针指向的指针是不是空指针,如果是就终止循环
            if(head->next==NULL)break;
            //输出现指针的数字
            printf("%d->",head->val);
            //把现指针指向的指针变成现指针
            head=head->next;
        }
        //输出最后一个数值
        printf("%d\n",head->val);
    }
    //outputList函数结束

    inputList(&Head);outputList(&Head);
    deleteDuplicates(&Head);outputList(&Head);

}//主函数结束

答案是完美的,任何数据都可以
评论区指点我

经验吸取
判断后才把现指针指向的指针变成现指针

猜你喜欢

转载自blog.csdn.net/Brain8Storm/article/details/107877774