题解 | #牛牛的链表删除#
牛牛的链表删除
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//删除的元素,直接跳过被删除的元素,指向下一个
{
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);
}
}