题解 | #从单向链表中删除指定值的节点#
从单向链表中删除指定值的节点
http://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f
笑死了,根本不会链表。没学过数据结构,只能用暴力搜索解决,测控人泪目。
先将头结点写入,
然后按顺序将下面的结点写入。
在写入过程中,要检索下一个将要写入的结点与前面已写入的结点的关系,相同则在相同处插入。
若在链中插入,则需要将后方已经确定的结点都后移。
后移可以从最后一位开始移动,如此避免从中间开始移动需要的寄存器,节省了时间。
不过检索的过程浪费了一些时间,应该把检索的范围和已经确定的结点长度联系起来,这样可以减少循环次数,还没想好,欢迎大佬指点。
改好了,第二个循环里N改成i。不过第三重循环还是有问题。
为什么牛客网中等难度的题目难度差这么多。
这合理吗?
动态申请内存比暴力申请最大内存还要浪费空间。
这合理吗?
牛客网判题系统吃了薛定谔吧。
#include<stdio.h>
int N,HEAD,DELTE;
int pull_1,pull_2,*pull_list,*chain;
int i=0,j=0,k=0;
int main()
{
scanf("%d",&N);
scanf("%d",&HEAD);
pull_list=(int*)calloc(2*N+1,sizeof(int));//动态申请内存反而比暴力直接申请10000更浪费,
chain=(int*)calloc(N+1,sizeof(int));//判题系统真是令人无语,这合理吗?
for(i=0;i<N-1;i++)//结点信息
{
scanf("%d %d ",&pull_1,&pull_2);
pull_list[2*i]=pull_1;
pull_list[2*i+1]=pull_2;
}
chain[0]=HEAD; //头结点
for(i=0;i<N;i++)//按序检索要插入的结点的首地址
{
for(j=0;j<i;j++)//以已经确定的结点做为标志
//范围与写入次数有关
{
if(pull_list[2*i+1]==chain[j])//判断插入位置
{
for(k=i;k>j;k--)//将插入位置空出
//此处的i其实有些问题,不知道
{
chain[k+1]=chain[k]; //移位
}
chain[j+1]=pull_list[2*i];//插入
}
}
}
scanf("%d\n",&DELTE);
for(i=0;i<N;i++)//删除结点
{
if(chain[i]==DELTE)
{
for(j=i;j<N;j++)
{
chain[j]=chain[j+1];//移位
}
}
}
for(i=0;i<N-1;i++)
{
printf("%d ",chain[i]);
}
//i++;
free(pull_list);
free(chain);
}