题解 | #牛牛的链表删除#
牛牛的链表删除
http://www.nowcoder.com/practice/d3df844baa8a4c139e103ca1b1faae0f
莫名其妙就通过了,但是测试用例没有通过。
我不理解。
尾部结点没有办法去除还是。
看注释。
#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//是要去除的数据
{
if(temp->next!= NULL)
{
del_node->next=temp->next; //被去除结点的前一个结点的下一个结点指向被去除的结点的下一个结点。
free(temp);//放掉被去除结点的内存
}
else
del_node=del_node->next;
}
}
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);
}
}