看注释吧,写的比较详细。

主要的问题就在于最后一个结点是否是需要删除的结点。

所以最后一个结点要单独判断(地址指向空)。

牛客网的数据集貌似不全。

我试了自编了几个测试用例都有些问题,但是百分之百通过了。

前面还有几次乌龙程序,也百分之百通过了。

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



int n,x,val;

struct ListNode
{
    int data;   
    struct list_node *next;  
};

typedef struct ListNode gut;

gut *creat_list_node(int c_data )
{   
    gut *HeadNode=NULL;
    gut *new_node=HeadNode;
    new_node=(gut*)malloc(sizeof(gut));
    memset(new_node,0,sizeof(gut));
    
    new_node->data=c_data;
    new_node->next=NULL;
    
    return new_node;
}

/*gut *forward_node(gut *HeadNode,int f_data)//头插
{
    gut *new_node=creat_list_node(f_data);
    gut *insert_node=HeadNode;
    new_node->next=insert_node->next;
    insert_node->next=new_node;
    
    return insert_node;
}*/



gut *tail_node(gut *HeadNode, int t_data)//尾插
{
    gut *new_node=creat_list_node(t_data);
    gut *insert_node=HeadNode;
    
    while(insert_node->next!=NULL)
    {
        insert_node=insert_node->next;
    }
    insert_node->next=new_node;
    
    return insert_node;
    
}

gut *print_node(gut *HeadNode)
{
    gut *pri_node=HeadNode->next;
    while(pri_node!=NULL)
    {
        printf("%d ",pri_node->data);
        pri_node=pri_node->next;
    }
    printf("\n");
    
    return pri_node->data;
    
}



gut *delete_node(gut *HeadNode, int d_data,int del_data)
{
    gut *del_node=HeadNode->next;
    gut *temp=del_node->next;  //提前获取下一个元素
    while(temp->next!=NULL)
    {
        if(temp->data!=del_data)//不删除的元素移动指针
        {
          del_node=del_node->next;
          temp=temp->next;
        }
        else//删除的元素,直接跳过被删除的元素,指向下一个
        {  
                del_node->next=temp->next; 
               free(temp);//放掉被删元素,防止陷入循环
        }
    }
    temp=del_node->next;  //给最后元素对齐,因为少了一次循环,temp地址混乱。
    while(temp->next==NULL)//专门用于判断最后一个元素
    {
         if(temp->data!=del_data)//如果最后一个元素不是要被删除的
        {
          del_node=del_node->next;//指针移到最后
          del_node->next=NULL;//地址指向空
          break;//出循环
        }
        else//如果最后一个元素是要被删除的
        {  
                del_node->next=NULL; //直接把倒数第二个元素的地址指向空
                break;
        } 
        
        
    }
    
    
    return del_node ;
}






int main()
{
   
    scanf("%d %d\n",&n,&x);
    { gut *HeadNode=creat_list_node(n);
        for(int i=0;i<n;i++)
        {
            scanf("%d ",&val);
            tail_node(HeadNode,val);
        }
            
            delete_node(HeadNode,n,x);            
            print_node(HeadNode);
        free(HeadNode);    
    }
    
    
}